如何获得对模块本身内部模块的引用?


158

如何从该模块中获取对模块的引用?另外,如何获得包含该模块的包装的参考?


7
我怀疑您可能会问这个问题,因为您在模块范围内有一个变量(例如,函数或类之外的BLAH = 10),然后是名为BLAH 的类/函数变量,并且您想区分。一个有效的问题是:这是否必要? 众所周知,范围规则容易出错,特别是“白痴”在您之后(即6个月后)接您代码的“白痴”。这样的技巧很少需要;我试图完全避免使用它们,因为它们经常造成混乱,并且在以后被错误地修改。
凯文·赖斯

2
@ KevinJ.Rice“在您之后(即六个月后的您)拿起您的代码的'白痴'”令我高兴!
arctelix 2014年

8
谁在乎他为什么问这个问题?有很多充分的理由需要执行此操作。
Christopher Barber

需要关闭。太有用了。
mlvljr

Answers:


211
import sys
current_module = sys.modules[__name__]

3
除此之外,如果重新加载模块将不太正确;我认为没有任何地方可以保证保留引用,如果有的话,重新加载实际上是行不通的,对吗?
Dima Tisnek

14
重新加载会重复使用相同的模块对象;没有创建新的模块对象,因此面对重新加载它仍然是正确的。
2013年

18

还有一种技术,它不会导入sys模块,并且可以说-取决于您的口味-更简单:

current_module = __import__(__name__)

请注意,没有导入。Python仅导入每个模块一次。


这似乎是避免导入sys的一种非常不错的方法。除了有点反常理之外,这种方法还有潜在的缺点吗?
JeremyDouglass

@JeremyDouglass。不是我知道的。import是一个合法的,已记录的内置函数(唯一的xx函数)。您可以将其替换为'importlib'软件包(必须将其导入)。也许-从未发生过-如果sys.path中提供了具有相同名称的模块,则相对/绝对导入可能会出现问题,在这种情况下,您可以使用函数的'level'参数来解决它。
Uri

16

如果在该模块中有一个类,则__module__该类的属性是该类的模块名称。因此,您可以通过访问模块sys.modules[klass.__module__]。这也适用于功能。


4
实际上,似乎(至少)对于一个函数而言,该__module__属性不是模块,而是字符串。因此,inspect.getabsfile(func.__module__)失败并显示“ TypeError:'os'不是模块,类,方法,函数,回溯,框架或代码对象 ”;虽然inspect.getabsfile(sys.modules[o.__module__])似乎过去了。
sdaau

12

您可以使用获取当前模块的名称 __name__

可以在sys.modules字典中找到模块参考。

请参阅Python 文档


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.