了解导入X和从X.Y导入Z之间的区别

2024-10-01 00:22:30 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个非常基本的问题,由@Mark Roddy写了一个非常广泛的答案 Use 'import module' or 'from module import'?

根据这个答案,每种方法都有优缺点,但结果是等价的,两者都起作用。你知道吗

这样做:

import module

或者

from module import foo

应该有用。你知道吗

我的问题:

考虑这个例子:

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'

以及:

from distutils.util import strtobool
print (strtobool('true'))

其输出如下:

1

所以我很困惑。两者都应该起作用。为什么Python会为第一种方法生成一个异常?你知道吗


Tags: or方法答案fromimporttrueuseutil
2条回答

如果import A,然后尝试访问A.B,则B必须是模块A中存在的有效属性。例如:

# A.py
from . import B
# or
B = 'foo'

如果A包含上述代码,那么在A内部,B是一个有效的本地名称,并扩展为模块A的可访问属性。但是,如果模块A没有定义任何B,则在import A时无法访问它。你知道吗

现在,import A.Bfrom A.B import ...显式地看的不是模块的属性,而是文件和文件夹。因此,即使在A.py内部没有定义符号B,只要有文件B.py或文件夹Bimport就会导入它。你知道吗

这些是等效的:

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(或mod1/__init__.py)中添加import mod2,则mod2将成为mod1导出的值,最后一个示例将起作用。distutils不导入distutils.util,因此您必须自己导入它才能访问其导出的成员。你知道吗

相关问题 更多 >