我想做这样的事情?
# __init__.py
import a_module
__all__ = [
'a_module',
]
__all__.extend(a_module.__all__) # it doesn't work
# AttributeError: 'module' object has no attribute '__all__'
有办法吗?
答案 0 :(得分:6)
更新:我不明白你为什么不这样做:
from a_module import *
...如果您想要做的就是重新发布a_module
发布的所有内容......这甚至是PEP8“制裁”明星导入使用的情况,这通常是不鼓励的。 / p>
...现在,如果上述解决方案不适用于您,这里或多或少是手写的等价物:
dir()
应该为您提供对象(包括模块)中的属性列表:
__all__.extend(dir(a_module))
如果您想过滤掉以__
和_
开头的内容,只需:
__all__.extend(x for x in dir(a_module) if not x.startswith('_'))
无论模块是否已声明__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__)