在运行时向Python模块添加属性,以便稍后导入
在运行时,我在循环中使用以下方法向模块添加属性:在运行时向Python模块添加属性,以便稍后导入,python,python-2.7,flask,flask-principal,Python,Python 2.7,Flask,Flask Principal,在运行时,我在循环中使用以下方法向模块添加属性: this_module = sys.modules[__name__] setattr(this_module, attr_name, attr_value) 当我从模块中调用print diru模块时,它会显示属性。太好了 当我导入模块并尝试在装饰器中使用该属性时,会不断抛出AttributeError异常。为了调试,我在导入的模块上调用了dir,没有列出任何动态添加的属性 我甚至为导入*将属性名添加到了_uall _uu,但仍然一无所获 任
this_module = sys.modules[__name__]
setattr(this_module, attr_name, attr_value)
当我从模块中调用print diru模块时,它会显示属性。太好了
当我导入模块并尝试在装饰器中使用该属性时,会不断抛出AttributeError异常。为了调试,我在导入的模块上调用了dir,没有列出任何动态添加的属性
我甚至为导入*将属性名添加到了_uall _uu,但仍然一无所获
任何想法都很好。另外,请让我知道我可能遗漏的任何术语。我在谷歌上找不到答案
-
根据Kevin的建议,我在我的Flask应用程序中添加了一个字典,而不是他建议的顶级字典,只是为了便于测试,并在其中添加了以下属性:
app.security = dict()
在循环中:
app.security[attr_name] = attr_value
在使用decorator的模块中,“time_entry”是一个属性名,它包含一个类实例:
@app.security['time_entry'].need()
当我尝试启动服务器时,现在出现以下错误:
@security["time_write"].require()
^
SyntaxError: invalid syntax
我已经为我的特殊问题创建了一个解决方案。这不是一个解决方案,我仍然计划在这个项目完成后进一步研究它
我创建了一个虚拟类,然后在我的Flask应用程序中设置了一个属性和它的一个实例
class Security: pass
app.security = Security()
然后,我直接将属性设置为安全类:
setattr(app.security, attr_name, attr_value)
同样,它无法解决为什么我在运行时创建的那些模块级属性没有被导入。一旦我有了这个问题的答案,我会回来编辑它。为什么要这样做而不仅仅是使用顶级字典?您确定在设置属性后调用装饰器吗?您还可以尝试执行全局attr\u name,后跟attr\u name=attr\u value。@凯文:但不能将字典用作修饰符,对吗?我必须能够在装饰器中调用它。@CristianCiupitu:属性名称和值是从数据库动态创建的。我认为它在这种情况下不起作用。你也不能用一个模块作为装饰器。装饰器同样可以很好地访问字典或模块。