为什么我要在python包的init中使用uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?

为什么我要在python包的init中使用uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?,python,package,Python,Package,我已经读过了,我知道它只影响来自。。。import*语句,但我无法找出真正的用例。既然我可以简单地避免在\uuuuu init\uuuu名称空间中导入这些名称,为什么我要在\uuuuuuu all\uuuuuu中重复导出的名称 例如: mypackage/\uuuuu init\uuuuuu.py from a import A A = "A" A1 = "A1" B = "B" mypackage/a.py from a import A A = "A" A1 = "A1"

我已经读过了,我知道它只影响来自。。。import*语句,但我无法找出真正的用例。既然我可以简单地避免在
\uuuuu init\uuuu
名称空间中导入这些名称,为什么我要在
\uuuuuuu all\uuuuuu
中重复导出的名称

例如:

mypackage/\uuuuu init\uuuuuu.py

from a import A
A = "A"
A1 = "A1"
B = "B"    
mypackage/a.py

from a import A
A = "A"
A1 = "A1"
B = "B"    
mypackage/b.py

from a import A
A = "A"
A1 = "A1"
B = "B"    
然后在python中:

>>> from mypackage import *
>>> A
'A'
>>> 
>>> A1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'A1' is not defined
>>> b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined
来自mypackage导入的
>>*
>>>A
“A”
>>> 
>>>A1
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
名称错误:未定义名称“A1”
>>>b
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
名称错误:未定义名称“b”
如您所见,
A
位于命名空间中,但
A1
b
不在命名空间中。为什么我必须定义
\uuuuuuuuuuuuuuuuuuu=[“A”]

在包的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuupy.py中定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

from package import *
这记录在

注意:如果您没有在包中定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

如果未定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,则sound.effects import*中的 不会将包sound.effects中的所有子模块导入到 当前名称空间;它只确保包sound.effects 已导入(可能在中运行任何初始化代码) 然后导入包中定义的任何名称。这包括明确定义的任何名称(和子模块) 通过
\uuuu init\uuuuu.py
加载)。它还包括包的任何子模块 由以前的导入语句显式加载的。考虑 此代码:

对此的“天真”解释可以是:


如果您不定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;来自包导入的
*
将导入来自该包的所有内容以及在中导入的任何内容,该包的
\uuuuu init\uuuuuuuuuuuuy


看看我的例子:我没有使用
\uuuu all\uuu
,但我仍然可以从mypackage import*
中显示或隐藏名称。那么为什么要使用它呢?@Zac您可以限制
*
附带的内容。在您的示例中,它将带来所有内容。@PeterWood:不是所有内容,而是只有在
\uuuuu init\uuuuuuuuu
中导入的内容(有问题的更新示例)“如果您不定义
\uuuuuuu all\uuuuuuuu
,来自包导入的
将带来该包和所有子包中的所有内容。”并非所有内容,而是仅导入在
\uuuu init\uuuu
@Zac中的内容。您可能需要初始化包,并需要导入标识符才能完成此操作。但您可能不想将其与软件包一起导出。因此,您可以使用
\uuuuuu all\uuuuu
来控制它。