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

时间:2013-09-23 10:40:16

标签: 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__'

有办法吗?

1 个答案:

答案 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__)