繁体   English   中英

如果X中有多个Y,Python究竟如何解析“从X导入Y”?

[英]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 XYfrom XY import some_name ),则Y将绑定到XY子模块。 后者是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

模块中的名称优先。 来自Python教程

请注意,从包导入项使用时,该项可以是包的子模块(或子包),也可以是包中定义的其他名称,如函数,类或变量。 import语句首先测试是否在包中定义了该项; 如果没有,它假定它是一个模块并尝试加载它。

语言参考中给出了相同的信息。

但是,如果任何代码导入子模块(通过其他更明确的方式,例如import XY ,其中Y只能引用模块),则子模块也将作为包中的名称存在。 因此,在这种情况下,它将取决于代码的顺序:一旦导入模块,它将覆盖同名的变量。

Python首先查看X文件夹下任何文件Y.py的当前工作目录,然后查找X包导入Y文件的已安装库。 如果包X中有一个Y变量,那么它将被导入,然后被该包的文件Y.py上的内容替换

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM