2016-07-22 25 views
3

我有一个包含一个名为Ÿ如果X在X中有多个Y,则Python如何解析“从X导入Y”?

一个两回事包X是一个模块:

# X/Y.py 
print 'hello' 

另一种是一个变量:

# X/__init__.py 
Y = 'world' 

如果我执行from X import Y其中Y做我得到和为什么?什么决定了导入语句的顺序和影子规则?

最后,有什么我可能会意外地做,将改变答案?

基本上,我得到一个错误报告,指出在用户的机器上这个代码导致从我的机器上得到的相反的Y导入。我没有访问用户的机器,所以我想弄清楚发生了什么。

如果在此之前的问题线索,我想知道: python: from x import y changes previous import result

回答

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

模块中的名称为准。从the Python tutorial

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

相同的信息在the language reference中给出。但是,如果任何代码导入子模块(通过其他更明确的方式,例如import X.Y,其中Y只能引用模块),那么该子模块也将作为包中的名称存在。所以在这种情况下,它将取决于代码的顺序:一旦你导入模块,它将覆盖相同名称的变量。

-1

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

相关问题