【问题标题】:Add attributes to Python module at runtime to be imported later在运行时向 Python 模块添加属性,以便稍后导入
【发布时间】: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


【解决方案1】:

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

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

class Security: pass
app.security = Security()

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

setattr(app.security, attr_name, attr_value)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 2022-10-14
    • 1970-01-01
    相关资源
    最近更新 更多