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

mat*_*att 3 python

我有一个包X,其中包含两个名为Y的不同的东西

一个是模块:

# X/Y.py
print 'hello'
Run Code Online (Sandbox Code Playgroud)

另一个是变量:

# X/__init__.py
Y = 'world'
Run Code Online (Sandbox Code Playgroud)

如果我执行from X import Y哪个Y,我会得到,为什么?是什么决定了import语句的顺序和阴影规则?

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

基本上我有一个错误报告,指示在用户的机器上,这个代码导致与我在我的机器上得到的相反的Y导入.我无法访问用户的计算机,所以我想弄清楚发生了什么.

我想知道在上一个问题中是否有线索: python:from x import y更改以前的导入结果

Mar*_*ers 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
Run Code Online (Sandbox Code Playgroud)