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

Add attributes to Python module at runtime to be imported later

我在运行时在循环中使用以下代码向模块添加属性:

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

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

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

我什至将 import * 的属性名称添加到 __all__,但仍然没有!

任何想法都会很棒。另外,请让我知道我可能遗漏的任何术语。我无法通过搜索 Google 找到答案。

--

根据 Kevin 的建议,我在我的 Flask 应用程序中添加了一个字典(而不是他的顶级建议,只是为了便于测试)并向其中添加了这些属性:

app.security = dict()

在循环中:

app.security[attr_name] = attr_value

在使用装饰器的模块中('time_entry'是一个属性名,它持有一个class实例):

@app.security['time_entry'].need()

当我尝试启动服务器时,出现此错误:

    @security["time_write"].require()
             ^
    SyntaxError: invalid syntax

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

我创建了一个虚拟对象 class,然后在我的 Flask 应用程序中使用它的一个实例设置了一个属性。

class Security: pass
app.security = Security()

然后,我直接给Security设置属性class:

setattr(app.security, attr_name, attr_value)

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