如果X中有多个Y,Python在“from X import Y”语句中是如何准确解析的?

3

我是一个有用的助手,可以为您翻译文本。

我有一个名为X的包,其中包含两个名为Y的不同内容。

其中一个是模块:

# X/Y.py
print 'hello'

另一个是变量:
# X/__init__.py
Y = 'world'

如果我执行from X import Y,那么我得到的是哪个Y,以及为什么?什么决定了导入语句的顺序和遮蔽规则?
最后,有没有什么我可能会意外地改变答案的事情?
基本上,我收到了一个错误报告,表明在用户的机器上,这段代码的结果与我在我的机器上得到的相反。我无法访问用户的机器,所以我正在试图弄清楚发生了什么。
我想知道是否有线索在这个之前的问题中: python: from x import y changes previous import result
3个回答

5

包中的模块一旦被导入,也会设置为父模块对象的属性。然而,from module import name 语法将首先查看导入模块对象(即 X 的全局变量)的属性以解析 name

因此,答案取决于具体情况。如果您尚未导入 X.Y 模块,则最终将得到将 Y 绑定到 'world' 的结果。如果您已经导入了 X.Y(使用 import X.Yfrom X.Y import some_name),那么 Y 将绑定到 X.Y 子模块。后者是 YX 中作为全局变量被设置的副作用。

演示:

$ mkdir foo
$ cat << EOF > foo/__init__.py
> bar = 'from the foo package'
> EOF
$ cat << EOF > foo/bar.py
> baz = 'from the foo.bar module'
> EOF
$ bin/python -c 'from foo import bar; print(bar)'
from the foo package
$ bin/python -c 'import foo.bar; from foo import bar; print(bar); print(bar.baz)'
<module 'foo.bar' from 'foo/bar.py'>
from the foo.bar module

1
模块中的名称优先。来自Python教程
请注意,当使用from package import item时,item可以是包的子模块(或子包),也可以是包中定义的其他名称,如函数、类或变量。导入语句首先测试项目是否在包中定义;如果没有,则假定它是一个模块并尝试加载它。
相同的信息在语言参考中给出。
但是,如果任何代码导入子模块(通过其他更明确的方式,例如import X.Y,其中Y只能引用模块),那么子模块也将作为包中的名称存在。因此,在这种情况下,它将取决于代码的顺序:一旦导入模块,它将覆盖相同名称的变量。

-1

Python首先在当前工作目录下查找X文件夹中的任何Y.py文件,然后查找安装的X包库以导入Y文件。 如果包X中有一个Y变量,则会被导入,然后替换为该包的Y.py文件中的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接