python - 如果 X 中有多个 Y,Python 究竟如何解析 "from X import Y"?

标签 python

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

一个是模块:

# 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

最佳答案

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

所以,答案是视情况而定。如果您还没有导入 X.Y 模块,那么您最终将 Y 绑定(bind)到 'world'。如果您导入了 X.Y(使用 import X.Yfrom X.Y import some_name),则 Y 绑定(bind)到X.Y 子模块。后者是 X 中的 Y 被设置为全局的副作用。

演示:

$ 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,Python 究竟如何解析 "from X import Y"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38520210/

相关文章:

python - 在一行中运行多行 for 循环

Python获取mac地址列表并将它们与文件列表进行比较

python - 请求中包含的安全 token 无效。当没有指定配置文件时

python - 使用 Re.split 从文件构造字典

python - "for/range"range 大的时候会不会很耗内存?

python - 在 virtualenv 中安装 pip 的 Matplotlib 要求

python - 如何根据 pandas 中其他列的条件创建新列?

python - 删除数据框中许多列具有相同值的行

python - 如何在 Cython 中输入生成器函数?

python - 使用 xlsxwriter 计算相对位置