扩展__all__.我如何获取模块__all__列表?

kha*_*iuk 2 python python-module

我想做这样的事情?

# __init__.py
import a_module

__all__ = [
    'a_module',
]

__all__.extend(a_module.__all__)  # it doesn't work
# AttributeError: 'module' object has no attribute '__all__'
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

Eri*_*lun 6

更新:我不明白你为什么不这样做:

from a_module import *
Run Code Online (Sandbox Code Playgroud)

......如果您想要做的就是重新发布所有a_module发布的内容......这甚至是PEP8"制裁"使用星级导入的情况,这通常是不鼓励的.

...现在,如果上述解决方案不适合您,这里或多或少是手写的等价物:

dir() 应该给你一个对象(包括一个模块)的属性列表:

__all__.extend(dir(a_module))
Run Code Online (Sandbox Code Playgroud)

如果你想过滤掉以__和开头的东西_,只需:

__all__.extend(x for x in dir(a_module) if not x.startswith('_'))
Run Code Online (Sandbox Code Playgroud)

无论模块是否已声明,这都应该有效__all__.

并且,完全模仿Python的默认行为,即将模块中的所有非下划线前缀事物视为公共,除非__all__声明:

__all__.extend((x for x in dir(a_module) if not x.startswith('_'))
               if not hasattr(a_module, '__all__')
               else a_module.__all__)
Run Code Online (Sandbox Code Playgroud)