自动计算__all__以仅使用显式定义的导入

时间:2018-11-10 22:51:36

标签: python

我在文件夹__init__中有一个foo/文件,该文件会导入一些模块

from a import ClassA
from b import *

__all__ = [s for s in dir() if not s.startswith('_')]

我的文件夹foo/包含其他.py个文件

foo/
  a.py  # Contain ClassA
  b.py  # Contain ClassB
  c.py

a导入c,所以当我导入a时,它会自动导入c并将其添加到{{1}的locals()范围},即使没有将__init__导入c中。

我希望初始化文件中的__init__仅包含我在文件中明确声明的导入(因此仅__all__ClassA)。但是,即使没有将ClassB导入c,也会自动添加。

如何动态计算__init__,使其仅包含我在__all__中明确定义的导入。 __init__.pylocals()都还从模块dir()返回其他文件。

理想情况下,该解决方案应同时兼容Py2.7 Py3。

1 个答案:

答案 0 :(得分:1)

foo.c当然会在foo locals()中出现,一旦导入,这就是python导入的工作方式。 __all__可以让您通过明确列出应导入的内容来控制from foo import *的功能。

因此,如果您希望from foo import *导入ab,则__init__.py仅需要包含:

__all__ = ['a', 'b']

仅在要将代码添加到使用子模块的__init__.py中时,您才不需要完全导入子模块。

因此,如果您要避免不必要的繁琐工作,而不必将子模块导入并添加到__all__,只需删除导入并明确使用__all__