Python 了解导入X和从X.Y导入Z之间的差异
这是一个非常基本的问题,由@Mark Roddy撰写,答案非常广泛 根据这个答案,每种方法都有利弊,但结果是相同的,两者都有效 这样做:Python 了解导入X和从X.Y导入Z之间的差异,python,Python,这是一个非常基本的问题,由@Mark Roddy撰写,答案非常广泛 根据这个答案,每种方法都有利弊,但结果是相同的,两者都有效 这样做: import module 或 应该有用 我的问题: 考虑这个例子: import distutils print (distutils.util.strtobool('true')) 其中: > Traceback (most recent call last): File "<stdin>", line 1, in > &
import module
或
应该有用
我的问题:
考虑这个例子:
import distutils
print (distutils.util.strtobool('true'))
其中:
> Traceback (most recent call last): File "<stdin>", line 1, in
> <module> AttributeError: module 'distutils' has no attribute 'util'
它给出了以下输出:
1
所以我很困惑。两者都应该起作用。为什么Python会为第一种方法生成异常?如果
导入A
,然后尝试访问A.B
,那么B
必须是模块A
中存在的有效属性。例如:
# A.py
from . import B
# or
B = 'foo'
如果A
包含上述代码,则在A
中,B
是一个有效的本地名称,扩展为模块A
的一个可访问属性。但是,如果模块A
未定义任何B
,则在导入A时无法访问该模块
现在,
import A.B
或from A.B import…
明确地查看的不是模块的属性,而是文件和文件夹。因此,即使在A.py
内部没有定义符号B
,只要存在文件B.py
或文件夹B
,import
将导入它。如果导入A
,然后尝试访问A.B
,则B
必须是模块A
中存在的有效属性。例如:
# A.py
from . import B
# or
B = 'foo'
如果A
包含上述代码,则在A
中,B
是一个有效的本地名称,扩展为模块A
的一个可访问属性。但是,如果模块A
未定义任何B
,则在导入A时无法访问该模块
现在,import A.B
或from A.B import…
明确地查看的不是模块的属性,而是文件和文件夹。因此,即使在A.py
内部没有定义符号B
,只要有文件B.py
或文件夹B
,import
将导入它。这些都是等效的:
from mod import val
val
import mod
mod.val
以下是:
from mod1.mod2 import val
val
import mod1.mod2
mod1.mod2.val
但这不起作用,因为未导入mod2
:
import mod1
mod1.mod2.val
如果在mod1.py
中添加import mod2
(或mod1/\uuu init\uuuuuuuuuuuuuuuupy
),则mod2
将成为mod1
导出的值,最后一个示例将起作用distutils
不导入distutils.util
,因此您必须自己导入它才能访问其导出的成员。这些是等效的:
from mod import val
val
import mod
mod.val
以下是:
from mod1.mod2 import val
val
import mod1.mod2
mod1.mod2.val
但这不起作用,因为未导入mod2
:
import mod1
mod1.mod2.val
如果在
mod1.py
中添加import mod2
(或mod1/\uuu init\uuuuuuuuuuuuuuuupy
),则mod2
将成为mod1
导出的值,最后一个示例将起作用distutils
不导入distutils.util
,因此您必须自己导入它才能访问其导出的成员。尝试使用import distutils.util
然后打印(distutils.util.strobool)
?@barny这不是一个需要解决的代码。请注意,您所建议的是我所做的,返回1-没关系。我在问为什么第一个问题会引发异常,因为在这一点上,您还没有使用import distutils.util
导入distutils.utiltry,然后print(distutils.util.strtobool)
?@barny这不是要解决的代码。请注意,您所建议的是我所做的,返回1-没关系。我在问为什么第一个会引发异常,因为此时您还没有导入distutils.utilThanks!我认为这也应该被添加到裁判问题中。这是丢失的重要信息,谢谢!我认为这也应该被添加到裁判问题中。这是一个重要的信息,但却没有