我在文件夹__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__.py
或locals()
都还从模块dir()
返回其他文件。
理想情况下,该解决方案应同时兼容Py2.7 Py3。
答案 0 :(得分:1)
foo.c
当然会在foo
locals()
中出现,一旦导入,这就是python导入的工作方式。 __all__
可以让您通过明确列出应导入的内容来控制from foo import *
的功能。
因此,如果您希望from foo import *
导入a
和b
,则__init__.py
仅需要包含:
__all__ = ['a', 'b']
仅在要将代码添加到使用子模块的__init__.py
中时,您才不需要完全导入子模块。
因此,如果您要避免不必要的繁琐工作,而不必将子模块导入并添加到__all__
,只需删除导入并明确使用__all__
。