"Import as" 无法识别,正常导入是

"Import as" isn't recognized, normal import is

我正在使用 matplotlib 来更好地理解它的结构,但我对以下代码感到困惑:

import matplotlib as mpl
from mpl import pyplot as plt # ModuleNotFoundError : No module named 'mpl'
mpl.pyplot # AttributeError: module 'matplotlib' has no attribute 'pyplot'

另一方面,如果我放弃导入 matplotlib as 一个不同的名称并改为执行

import matplotlib
from matplotlib import pyplot as plt #works!

一切正常。

更疯狂的是,如果我把这两者“结合”起来 将 matplotlib 导入为 mpl 从 matplotlib 将 pyplot 导入为 plt #works! mpl.pyplot.get_backend() # 有效

我可以奇怪地访问 pyplot 的属性,即使我将其引用为 mpl.pyplot

这是怎么回事,为什么

(请注意,我当然知道首选方法是将 pyplot 导入为 import matplotlib.pyplot as plt,但我调查的重点恰恰是了解失败的原因以及为什么当我冒险走出熟悉的代码街道。)

import 语句中的 as 部分只是语法糖,用于将导入的模块分配给具有给定名称的变量。 import documentation 是这样描述的:

If the module name is followed by as, then the name following as is bound directly to the imported module.

“绑定”在此上下文中意味着对给定名称进行分配。下面的语句

import someModule as someName

相当于这段代码:

import someModule
someName = someModule

因此,当您执行 import matplotlib as mpl 时,您所做的就是创建一个名为 mpl 的变量。这对任何进一步的 import 语句没有影响,因为 import 语句不关心您的局部变量,而是搜索 python 包和模块 - 并且 import as 语句不能更改包或模块名称进口元素。这是一件好事,因为您不希望您的 import 语句仅仅因为另一个 import 5 行之前在 as 子句中使用了冲突的名称而失败。

现在,为什么您使用 import mpl.pyplot 语句得到奇怪的结果 - 不知道,它不应该起作用。如果您尝试以下操作,您可以看到预期的行为:

import os as asdf
import asdf.path    #ModuleNotFoundError: no module named 'asdf'

在 Archlinux 上使用 python 3.10.2 进行测试。如果你的例子是可重现的,那么你可能在你的特定 python 版本中发现了一个奇怪的错误或未定义的行为,或者有一些其他问题(例如你的路径中的一个 mpl 模块......虽然那在它自己无法解释为什么您会收到有关 matplotlib 而不是 mpl 的错误消息。

总而言之,as 所做的只是为导入的对象分配一个名称,因此使用 as 分配的名称不能用作另一个导入语句中的源。


关于包导入以及为什么matplotlib.pyplot报错:

导入包只会导入包本身,而不是它的任何子包或模块。包可以在其 __init__.py 中显式导入子模块,因此如果 matplotlib 初始化文件包含类似 from . import pyplot 行的语句,则访问 matplotlib.pyplot 将起作用。然而,包可能选择不导入任何子模块的原因有很多,例如导入和初始化它们所需的时间和资源。

当您执行 import module as mdl 时,它不会更改模块名称。它只会在您实际使用它时影响其他语句。但名称在实际 python 库或外部库中没有改变。所以你可以做的是:

import matplotlib
from matplotlib import pyplot as plt

from matplotlib import pyplot as plt

这是我的答案...

python 中的所有内容都是一个对象,但是当您导入 matplotlib 时,您正在导入所有库但您不能更改函数名称,库将寻找 plt from matplotlib import pyplot as plt 在这种情况下。 可以直接使用plt,但不能使用mpl.plt.

当你尝试它时:

import matplotlib as mpl
from mpl import pyplot as plt # ModuleNotFoundError : No module named 'mpl'
mpl.pyplot 

您应该正确导入:

   import matplotlib as mpl
   from mpl import pyplot 
   mpl.pyplot 

'As' 更改您将在项目中使用的模块名称,但不是来自另一个导入。但是如果你直接使用 plt 它会起作用。 试试这个代码来理解:

import matplotlib as mpl
import matplotlib
print(type(matplotlib))
print(type(mpl))
from matplotlib import pyplot as plt# ModuleNotFoundError : No module named 'mpl'
from matplotlib import pyplot

print(type(plt))
print(type(mpl.pyplot))
plt
mpl.pyplot