当前位置: 首页 > 知识库问答 >
问题:

了解导入X和从X.Y导入Z之间的差异

裴泰平
2023-03-14

这是一个非常基本的问题,有一个非常广泛的答案,由@Mark Roddy编写使用导入模块或从模块导入?

根据这个答案,每种方法都有利弊,但结果是相同的,两者都有效。

这样做:

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会为第一种方法生成异常?

共有2个答案

令狐新翰
2023-03-14

这些是等效的:

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,因此您必须自己导入它才能访问其导出的成员。

易俊远
2023-03-14

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

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

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

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

 类似资料:
  • 问题内容: 在Python中,我不太清楚以下两行代码之间的区别: 要么 他们不是都只是从模块X导入所有内容吗?有什么不同? 问题答案: 之后,你可以参考的东西一样。之后,您可以像一样直接引用事物。因为第二种形式将名称直接导入到本地名称空间,所以如果您从许多模块中导入内容,则可能会产生冲突。因此,不鼓励使用。 您也可以执行,仅将导入到本地名称空间,而不导入中的所有内容。这样做会更好,因为如果您列出了

  • 我已经看到了从ES6中的另一个模块导入代码的以下两种变体: 和 其中是在文件中定义的ES6类 Module.js 这两种导入语句有什么区别?

  • 问题内容: 我有一个用ES6编写的node.js库(与Babel一起编译),在其中导出了以下子模块: 如果从我的主要项目中,我包括这样的图书馆 我可以看到正确的输出,并且可以按预期工作。但是,如果我尝试包含这样的库: 会的。 有人可以解释这里发生了什么吗?这两种导入方法不应该等效吗?如果没有,我想念什么? 问题答案: 正在请求一个具有所有“ lib”命名出口的对象。 被命名为exports,这就是

  • 我刚刚开始了一个小节点项目,它将与MongoDB接口。然而,我似乎无法正确地导入相关的节点模块,即使我已经通过正确地安装了它们。 例如,以下代码抛出一个错误,告诉我“express没有默认导出”: 但是,此代码的工作原理: 所以我的问题是,import和variable/require方法的功能有什么不同?我想在这个项目上解决困扰我导入的任何问题,因为它似乎可能会在将来引起额外的问题。

  • 问题内容: 两者之间的性能复杂度是多少 和 PS。 我知道第一个文件将包含每个文件,第二个文件将仅包含选定的类文件。 问题答案: 在运行时0。 两者都生成相同的字节码

  • 问题内容: 我知道这是一个愚蠢的问题,但我才刚刚开始学习python,但我对python并不了解。我的问题是之间有什么区别 和 为什么我不能写 谁能抽出几分钟来启发我? 问题答案: 将Tkinter中的每个公开对象导入到您当前的名称空间中。 导入名称空间中的“名称空间” Tkinter并 执行相同的操作,但是在本地将其“重命名”为“ tk”以节省您的输入 假设我们有一个模块foo,其中包含类A,B