在这方面阅读了相当数量后,我为自己想出了以下内容。
__init__.py
包含所有供外部使用的子模块的导入;一个__all__
变量,其中包含所有。__init__.py
中导入,并且未在其__all__
成员中列出。这会阻止但不会阻止用户代码访问这些非公共模块。-m
运行这些可运行的子模块。例如python3 -m mypackage.mySubModule
from mypackage import *
导入整个模块。允许子模块作者,使用简单方法获取所有(公共)子模块,并公平地信任它们以智能地处理冲突问题,识别子模块的名称等等似乎是公平的。它还会给{ {1}} __init__.py
这是__all__
我唯一能够容忍:} 我能想到的最大缺点是......
from foo import *
这一次,这就是着名的最后一句话'因为它得到了。我也很高兴听到其他问题。
以下是一个简化但完整的示例。非常感谢所有人。
文件&目录布局
from foo import *
__初始化__。PY
mypackage/
__init__.py
A.py # class A
B.py # class B
_Helper.py # Helper class used by A and B
api.py # public API for mypackage
runMe.py # A runnable class inside mypackage (possibly for testing)
userCode.py # Code that uses mypackage; could be located anywhere
A.py(和B.py一样)
from mypackage.A import A
from mypackage.B import B
from mypackage import api
__all__ = ['A', 'B', 'api']
_Helper.py
from mypackage import _Helper
class A:
def __init__ (self): pass
def test (self): _Helper.printMessage()
api.py
def printMessage ():
print("*** _Helper.printMessage() is reachable ***")
runMe.py
from mypackage import *
def createA (): return A()
def createB (): return B()
userCode.py 导入mypackage
from mypackage import api
a = api.createA()
a.test()
b = api.createB()
b.test()