无法识别"导入为",正常导入是



我在玩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'

另一方面,如果我放弃导入不同名称的matplotlibas,而是执行

import matplotlib
from matplotlib import pyplot as plt #works!

事情是可行的。

更疯狂的是,如果我;"组合";这两个将matplotlib导入为mpl从matplotlib导入pyplot作为plt#工作!mpl.pyplot.get_backend((#适用于

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

这里发生了什么,为什么

  • from mpl import pyplot as plt抛出一个ModuleNotFoundError

  • import mpl.pyplot不工作?由于错误消息表明mpl已正确解析为matplotlib,但仍然找不到pyplot。。。

  • 在我的上一个例子中,将pyplot引用为mpl.pyplot不会导致错误吗?

(请注意,我当然知道首选的方法是将pyplot导入为import matplotlib.pyplot as plt,但我调查的重点正是了解当我冒险走出人迹罕至的代码时,失败的原因和原因。(

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

如果模块名称后面跟as,那么as后面的名称将直接绑定到导入的模块。

"绑定";在这种情况下,意味着对给定的名称进行赋值。以下陈述

import someModule as someName

相当于这个代码:

import someModule
someName = someModule

因此,当您执行import matplotlib as mpl时,所要做的就是创建一个名为mpl的变量。这对任何进一步的导入语句都没有影响,因为导入语句不关心本地变量,而是搜索python包和模块,而import as语句无法更改导入元素的包或模块名称。这是一件好事,因为您不希望您的导入语句仅仅因为前面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 init文件包含类似from . import pyplot行的语句,那么访问matplotlib.pyplot就可以了。然而,包可能选择不导入任何子模块的原因有很多,例如导入和初始化子模块所需的时间和资源。

python中的所有东西都是一个对象,但当您导入matplotlib时,您正在导入所有库,但您无法更改函数名称,库将查找plt在这种情况下为CCD_ 28。你可以直接使用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

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

import matplotlib
from matplotlib import pyplot as plt

或仅from matplotlib import pyplot as plt

这是我的答案。。。

最新更新