在运行时向Python模块添加属性以便稍后导入

时间:2015-02-28 04:31:20

标签: python python-2.7 flask flask-principal

我在运行时使用以下内容在模块中向模块添加属性:

this_module = sys.modules[__name__]
setattr(this_module, attr_name, attr_value)

当我从模块中调用print dir(this_module)时,它会显示属性。太好了!

当我导入模块并尝试在装饰器中使用该属性时,AttributeError异常会不断被抛出。为了调试,我在导入的模块上调用dir(),并且没有列出动态添加的任何属性!

我甚至为__all__添加了import *的属性名称,但仍然没有!

任何想法都会很棒。另外,请告诉我可能遗漏的任何术语。我无法找到搜索谷歌的答案。

-

根据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

1 个答案:

答案 0 :(得分:0)

我为我的特定问题创建了解决方法。它不是解决方案,我仍计划在项目完成后进一步调查。

我创建了一个虚拟类,然后在我的Flask应用程序中设置了一个带有它的实例的属性。

class Security: pass
app.security = Security()

然后,我将属性直接设置为Security类:

setattr(app.security, attr_name, attr_value)

同样,它并没有解决为什么我在运行时创建的模块级属性没有被导入的原因。一旦我得到了这个问题的答案,我就会回来编辑这个。