代码之家  ›  专栏  ›  技术社区  ›  1pluszara

python2:将全局变量传递给工厂装饰器

  •  0
  • 1pluszara  · 技术社区  · 6 年前

    在下面的脚本中,我想使用 name_type 中的全局变量 decorator 打电话给 get_names 功能。请不要担心程序逻辑。

    name_type=None
    def main():
        global name_type
        name_type="FEMALE"
        get_names()
    
    def superNameDecorator(value):
        def nameDecorator(func):
            if value in ["MALE"]:
                def wrapper1(*args,**kwargs):
                    original_result=func(*args,**kwargs)
                    modified_result= "<MALE>"+original_result + "<\MALE>"
                    return modified_result
                return wrapper1
            elif value in ["FEMALE"]:
                def wrapper2(*args,**kwargs):
                    original_result=func(*args,**kwargs)
                    modified_result= "<FEMALE>"+original_result + "<\FEMALE>"
                    return modified_result
                return wrapper2
        return nameDecorator
    
    @superNameDecorator(name_type)
    def get_names():
        name='AMY'
        return name
    
    if __name__ == "__main__":
        main()  
    

    名称\u类型 我错过了什么?

    Traceback (most recent call last):
      File "GlobalTesting.py", line 29, in <module>
        main()
      File "GlobalTesting.py", line 5, in main
        get_names()
    TypeError: 'NoneType' object is not callable
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Patrick Haugh    6 年前

    什么时候? get_names name_type None ,因为 main 还没接到电话。两个都不是 if/elif 我跑了,所以 nameDecorator 退货 没有 获取\u名称 . 一种解决办法是移除 把它变成一个 __name__ 检查文件顶部附近。

    import os
    import re
    import sys
    
    
    name_type=None
    if __name == '__main__':  # If this doesn't happen, this error will still occur.
        name_type="FEMALE"
    
    def superNameDecorator(value):
        def nameDecorator(func):
            if value in ["MALE"]:
                def wrapper1(*args,**kwargs):
                    original_result=func(*args,**kwargs)
                    modified_result= "<MALE>"+original_result + "<\MALE>"
                    return modified_result
                return wrapper1
            elif value in ["FEMALE"]:
                def wrapper2(*args,**kwargs):
                    original_result=func(*args,**kwargs)
                    modified_result= "<FEMALE>"+original_result + "<\FEMALE>"
                    return modified_result
                return wrapper2
        return nameDecorator
    
    @superNameDecorator(name_type)
    def get_names():
        name='AMY'
        return name
    
    if __name == '__main__':
        get_names()
    

    一个更明智的解决办法是重写你的 姓名装饰人 处理任何 ,以及缺乏 ,在某种程度上这对你来说是有意义的。