我正在动态定义模块中的函数,然后更新模块的__all__
和函数的__name__
属性以匹配模块中的名称。我想知道更新函数的__module__
属性以及指向函数将驻留的模块是否是个好主意。文档说__module__
是:
定义函数的模块的名称,如果不可用,则为None。
创建函数的代码驻留在一个不同的模块中,该模块与函数所在的模块几乎无关。此模块中没有参考该功能。
我已经在邮件列表上做了一些讨论但是我对__module__
的语义是什么以及我是否应该将其设置为None或函数所在的模块或者代码所在的模块创建函数。现在就离开它,但我很想知道是否有人知道答案。
答案 0 :(得分:7)
我不会这样做。将功能从一个模块导入另一个模块是很常见的。 __module__
属性用于检索定义函数的模块,以读取源代码或有时在脚本中重新导入它。我不认为定义是通过静态代码还是动态定义有很大不同:如果有人想要读取函数的源代码,他们应该查看动态创建它的模块。
您可以查看PEP 3130。虽然它被拒绝了,但它可能会让你更深入地了解__module__
的目的,而不是其他地方的单句描述。
答案 1 :(得分:1)
你不应该经常担心__module__
,有时它会用于暗魔法或知道函数的来源(例如)调试,但大多数时候每个人都忽略它。如果你真的很担心集__module__ = "dynamically_defined_function"
或类似的东西。