2

我想做这样的事情吗?

# __init__.py
import a_module

__all__ = [
    'a_module',
]

__all__.extend(a_module.__all__)  # it doesn't work
# AttributeError: 'module' object has no attribute '__all__'

有没有办法做到这一点?

4

1 回答 1

7

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

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__)
于 2013-09-23T10:49:00.220 回答