如何在Python中获取对当前模块属性的引用

时间:2009-06-13 09:45:04

标签: python

我试图在命令行中看起来像这样:

>>> import mymodule
>>> names = dir(mymodule)

如何从mymodule内部获取对mymodule中定义的所有名称的引用?

这样的事情:

# mymodule.py
names = dir(__thismodule__)

4 个答案:

答案 0 :(得分:138)

如前所述,globals为您提供了一个字典而不是dir(),它为您提供了模块中定义的名称列表。我通常看到这样做的方式是这样的:

import sys
dir(sys.modules[__name__])

答案 1 :(得分:121)

只需使用globals()

  

globals() - 返回一个字典   代表当前的全球符号   表。这总是字典   当前模块的内部(在   功能或方法,这是模块   它定义的地方,而不是模块   它被称为。)

http://docs.python.org/library/functions.html#globals

答案 2 :(得分:7)

同时查看内置的inspect模块。它非常方便。

答案 3 :(得分:1)

答案可能为时已晚,但我没有为自己找到正确的答案。 python inspect.stack()中最接近,最精确的解决方案(比3.7.x更快):

  # search for first module in the stack
  stack_frame = inspect.currentframe()
  while stack_frame:
    print('***', stack_frame.f_code.co_name, stack_frame.f_code.co_filename, stack_frame.f_lineno)
    if stack_frame.f_code.co_name == '<module>':
      caller_module = inspect.getmodule(stack_frame)
      if not caller_module is None:
        #... do something here ...
      break
    stack_frame = stack_frame.f_back

专家

  • globals()方法更精确
  • 不依赖于堆栈中间帧,例如,可以通过挂钩或pytest之类的3dparty工具添加该中间帧:
*** foo ... ..
*** boo ... ..
*** runtest c:\python\x86\37\lib\site-packages\xonsh\pytest_plugin.py 58
*** pytest_runtest_call c:\python\x86\37\lib\site-packages\_pytest\runner.py 125
*** _multicall c:\python\x86\37\lib\site-packages\pluggy\callers.py 187
*** <lambda> c:\python\x86\37\lib\site-packages\pluggy\manager.py 86
*** _hookexec c:\python\x86\37\lib\site-packages\pluggy\manager.py 92
*** __call__ c:\python\x86\37\lib\site-packages\pluggy\hooks.py 286
*** <lambda> c:\python\x86\37\lib\site-packages\_pytest\runner.py 201
*** from_call c:\python\x86\37\lib\site-packages\_pytest\runner.py 229
*** call_runtest_hook c:\python\x86\37\lib\site-packages\_pytest\runner.py 201
*** call_and_report c:\python\x86\37\lib\site-packages\_pytest\runner.py 176
*** runtestprotocol c:\python\x86\37\lib\site-packages\_pytest\runner.py 95
*** pytest_runtest_protocol c:\python\x86\37\lib\site-packages\_pytest\runner.py 80
*** _multicall c:\python\x86\37\lib\site-packages\pluggy\callers.py 187
*** <lambda> c:\python\x86\37\lib\site-packages\pluggy\manager.py 86
*** _hookexec c:\python\x86\37\lib\site-packages\pluggy\manager.py 92
*** __call__ c:\python\x86\37\lib\site-packages\pluggy\hooks.py 286
*** pytest_runtestloop c:\python\x86\37\lib\site-packages\_pytest\main.py 258
*** _multicall c:\python\x86\37\lib\site-packages\pluggy\callers.py 187
*** <lambda> c:\python\x86\37\lib\site-packages\pluggy\manager.py 86
*** _hookexec c:\python\x86\37\lib\site-packages\pluggy\manager.py 92
*** __call__ c:\python\x86\37\lib\site-packages\pluggy\hooks.py 286
*** _main c:\python\x86\37\lib\site-packages\_pytest\main.py 237
*** wrap_session c:\python\x86\37\lib\site-packages\_pytest\main.py 193
*** pytest_cmdline_main c:\python\x86\37\lib\site-packages\_pytest\main.py 230
*** _multicall c:\python\x86\37\lib\site-packages\pluggy\callers.py 187
*** <lambda> c:\python\x86\37\lib\site-packages\pluggy\manager.py 86
*** _hookexec c:\python\x86\37\lib\site-packages\pluggy\manager.py 92
*** __call__ c:\python\x86\37\lib\site-packages\pluggy\hooks.py 286
*** main c:\python\x86\37\lib\site-packages\_pytest\config\__init__.py 90
*** <module> c:\Python\x86\37\Scripts\pytest.exe\__main__.py 7

缺点:

  • 一种非常精确的方法,可以返回在可执行文件中注册的模块,例如pytest.exe,这可能不是您想要的。
  • inspect.getmodule仍然可能在有效模块上返回None,具体取决于钩子