我读了Python 3中关于导入语句here的引用,其中说:

from表单使用了一个稍微复杂的过程: 找到from子句中指定的模块,如果需要,加载并初始化它; 对于进口条款中指定的每个标识符: 判断导入的模块是否具有该名称的属性 if not, attempt to import a submodule with that name and then check the imported module again for that attribute 如果没有找到该属性,则引发ImportError. 否则,对该值的引用存储在本地命名空间中, 如果存在,则使用as子句中的名称,否则使用 属性名称

对于上面引用的块,我不知道它真正说明了什么形式: "从A进口B".在我的理解中,在这种情况下,如果B不是A的属性,那么进程将搜索一个名为"B"的子模块,如果找到了,进程将搜索一个名为"B"的属性在B子模块(从"then check the imported module again for that attribute"),我的理解正确与否?需要你的帮助

推荐答案

它再次判断first模块,而不是子模块.

例如,from foo import bar会找到foo模块并判断它是否有bar属性.如果没有这样的属性,它将try 导入一个foo.bar子模块.如果这个新的导入成功,它通常会导致子模块被设置为foo上的bar属性.然后,第一个导入将判断fooagain以查找它期望现在存在的bar属性.

(文档中的描述省略了最后一步—如果foo上仍然没有bar属性,那么导入将try 直接从sys.modules检索foo.bar.这在某些循环导入情况下很重要,因为循环导入中初始化顺序是如何产生的.)

Python相关问答推荐

Class_weight参数不影响RandomForestClassifier不平衡数据集中的结果

使用SciPy进行曲线匹配未能给出正确的匹配

try 在树叶 map 上应用覆盖磁贴

Pytest两个具有无限循环和await命令的Deliverc函数

如何在Windows上用Python提取名称中带有逗号的文件?

如何从具有不同len的列表字典中创建摘要表?

Django RawSQL注释字段

用渐近模计算含符号的矩阵乘法

为什么numpy. vectorize调用vectorized函数的次数比vector中的元素要多?

为什么\b在这个正则表达式中不解释为反斜杠

判断solve_ivp中的事件

Python Tkinter为特定样式调整所有ttkbootstrap或ttk Button填充的大小,适用于所有主题

Pandas:填充行并删除重复项,但保留不同的值

在Google Drive中获取特定文件夹内的FolderID和文件夹名称

在numpy数组中寻找楼梯状 struct

如何将一组组合框重置回无 Select tkinter?

如何在信号的FFT中获得正确的频率幅值

如何使用加速广播主进程张量?

如何在不遇到IndexError的情况下将基数10的整数转换为基数80?

根据边界点的属性将图划分为子图