为什么我要在python包的init中使用uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?
我已经读过了,我知道它只影响来自。。。import*语句,但我无法找出真正的用例。既然我可以简单地避免在为什么我要在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"
\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
来控制它。