When a module named spam is imported, the interpreter first searches
for a built-in module with that name. If not found, it then searches
for a file named spam.py in a list of directories given by the
variable 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会尝试从您的time.py文件中导入time属性,但是会失败并抛出ImportError。
在CPython 3.5中,time是一个内置模块。根据上面的引用,运行from time import time成功导入内置模块,而无需在sys.path上搜索模块。
如果您从标准库中隐藏非内置模块(例如inspect),则两个CPython版本都会引发相同的错误:
me@temp:~$ cat inspect.py
from inspect import signature
me@temp:~$ python3.4 -c 'import inspect'
Traceback (most recent call last):
File "", line 1, in
File "/home/me/inspect.py", line 1, in
from inspect import signature
ImportError: cannot import name 'signature'
me@temp:~$ python3.5 -c 'import inspect'
Traceback (most recent call last):
File "", line 1, in
File "/home/me/inspect.py", line 1, in
from inspect import signature
ImportError: cannot import name 'signature'