我想做这样的事情吗?
# __init__.py
import a_module
__all__ = [
'a_module',
]
__all__.extend(a_module.__all__) # it doesn't work
# AttributeError: 'module' object has no attribute '__all__'
有没有办法做到这一点?
我想做这样的事情吗?
# __init__.py
import a_module
__all__ = [
'a_module',
]
__all__.extend(a_module.__all__) # it doesn't work
# AttributeError: 'module' object has no attribute '__all__'
有没有办法做到这一点?
更新:我不明白你为什么不这样做:
from a_module import *
...如果您只想重新发布所有已发布的内容a_module
...这甚至是 PEP8 “批准”使用星号导入的情况,通常不鼓励这样做。
...现在,如果上述解决方案不适合您,这里或多或少是一个手写的等价物:
dir()
应该为您提供对象(包括模块)中的属性列表:
__all__.extend(dir(a_module))
如果您想过滤掉以__
and开头的内容_
,只需:
__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__)