【发布时间】:2015-02-28 04:31:19
【问题描述】:
我在运行时使用循环内的以下内容向模块添加属性:
this_module = sys.modules[__name__]
setattr(this_module, attr_name, attr_value)
当我从模块调用print dir(this_module) 时,它会显示属性。太好了!
当我导入模块并尝试在装饰器中使用该属性时,AttributeError 异常不断被抛出。为了调试,我在导入的模块上调用了dir(),并且没有列出任何动态添加的属性!
我什至将__all__ 的属性名称添加到import *,但仍然没有!
任何想法都会很棒。另外,请让我知道我可能遗漏的任何术语。我无法在 Google 中找到答案。
--
根据 Kevin 的建议,我在我的 Flask 应用程序中添加了一个字典(而不是他的顶级建议,只是为了便于测试)并将这些属性添加到其中:
app.security = dict()
在循环中:
app.security[attr_name] = attr_value
在使用装饰器的模块中('time_entry'是一个属性名,它包含一个类实例):
@app.security['time_entry'].need()
当我尝试启动服务器时,我现在收到此错误:
@security["time_write"].require()
^
SyntaxError: invalid syntax
【问题讨论】:
-
你为什么要这样做而不是仅仅使用顶级字典?
-
你确定装饰器是在 属性设置后调用的吗?你也可以尝试做
global attr_name,然后是attr_name = attr_value。 -
@Kevin:不过,不能使用字典作为装饰器,对吧?我必须能够在装饰器中调用它。
-
@CristianCiupitu:属性名称和值是从数据库中动态创建的。我不认为它在这种情况下会起作用。
-
您也不能将模块用作装饰器。装饰器同样可以访问字典或模块。
标签: python python-2.7 flask flask-principal