Python导入阴影在3.4.6和3.5.2之间不同

时间:2017-07-19 19:28:21

标签: python import python-internals shadowing

Python 3.4.6和3.5.2之间的Python导入阴影似乎不同:

$ cat time.py
from time import time
$ pyenv global 3.4.6
$ python -V
Python 3.4.6
$ python time.py 
Traceback (most recent call last):
  File "time.py", line 1, in <module>
    from time import time
  File "/home/vagrant/tmp/time.py", line 1, in <module>
    from time import time
ImportError: cannot import name 'time'
$ pyenv global 3.5.2 
$ python -V
Python 3.5.2
$ python time.py
$ echo no error
no error

问题1:为什么......那些东西?

问题2:更新日志中有什么内容吗?我找不到任何东西......

1 个答案:

答案 0 :(得分:6)

The documentation表示

  

导入名为spam的模块时,解释程序首先搜索   对于具有该名称的内置模块。如果没有找到,则搜索   对于由。给出的目录列表中名为spam.py的文件   变量sys.path

(强调我的)

time并不是Python 3.4中的内置模块模块,但在Python 3.5中有所改变:

me@temp:~$ python3.4 -c 'import sys; print("time" in sys.builtin_module_names)'
False
me@temp:~$ python3.5 -c 'import sys; print("time" in sys.builtin_module_names)'
True

您可以看到引入更改here的补丁(与issue 5309相关)。考虑到更改日志mentions the issue 5309,但没有重新说明。在time模块中,可以肯定地说这个变化是副作用,是CPython的实现细节。

由于time不是CPython 3.4中的内置模块,而sys.path中的第一个目录是当前脚本目录,from time import time会尝试导入{{1}来自time文件的属性,但失败并抛出time.py

在CPython 3.5中ImportError 内置模块。根据上面的引用,运行time成功导入内置模块,而不在from time import time上搜索模块。

如果从标准库隐藏非内置模块,CPython版本都会引发相同的错误,例如sys.path

inspect