[英]How exactly does Python resolve “from X import Y” if there are multiple Ys in X?
我有一个包X,其中包含两个名为Y的不同的东西
一个是模块:
# X/Y.py
print 'hello'
另一个是变量:
# X/__init__.py
Y = 'world'
如果我from X import Y
执行Y我得到了为什么 ? 是什么决定了import语句的顺序和阴影规则?
最后,有什么我可能会意外做的会改变答案吗?
基本上我有一个错误报告,指示在用户的机器上,这个代码导致与我在我的机器上得到的相反的Y导入。 我无法访问用户的计算机,所以我想弄清楚发生了什么。
我想知道在上一个问题中是否有线索: python:from x import y更改以前的导入结果
包中的模块一旦导入,也会在父模块对象上设置为属性。 但是, from module import name
语法将首先查看导入的模块对象( X
的全局变量)的属性以解析name
。
所以,答案是它取决于。 如果你尚未导入XY
模块,那么你最终将Y
绑定到'world'
。 如果已导入XY
(使用import XY
或from XY import some_name
),则Y
将绑定到XY
子模块。 后者是Y
在X
中的副作用已被设定为全局。
演示:
$ 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
Python首先查看X文件夹下任何文件Y.py的当前工作目录,然后查找X包导入Y文件的已安装库。 如果包X中有一个Y变量,那么它将被导入,然后被该包的文件Y.py上的内容替换
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.