2017-07-19 72 views
7

Pythona import shadowing wydaje się być inna od wersji 3.4.6 i 3.5.2:Python import shadowing różnią się między 3.4.6 i 3.5.2

$ 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 

Pytanie 1: Dlaczego ... te rzeczy?

Pytanie 2: Czy jest coś w tym dzienniku zmian? Nie mogę znaleźć nic ...

+0

Jakie jest wyjście 'python -c„import sys; print (sys.path) "dla obu tłumaczy? –

+0

W obu przypadkach pierwsza ścieżka jest pustym ciągiem. Niemożliwe do wklejenia, za dużo znaków. –

Odpowiedz

6

The documentation stwierdza, że ​​

Gdy moduł o nazwie spam jest importowany, interpreter Pierwsze wyszukiwania dla wbudowanego modułu o tej nazwie. Jeśli nie zostanie znaleziony, wyszukuje dla pliku o nazwie spam.py na liście katalogów podanych przez zmienną zmienną zmienną.

(Kopalnia nacisk)

time nie był wbudowany moduł modułu w Pythonie 3.4, ale to się zmieniło w Pythonie 3.5:

[email protected]:~$ python3.4 -c 'import sys; print("time" in sys.builtin_module_names)' 
False 
[email protected]:~$ python3.5 -c 'import sys; print("time" in sys.builtin_module_names)' 
True 

można zobaczyć próbkę, która wprowadzana zmień here (powiązane z issue 5309). Biorąc pod uwagę, że dziennik zmian mentions the issue 5309, ale nic nie mówi ponownie. Moduł time, można bezpiecznie powiedzieć, że zmiana była efektem ubocznym i jest szczegółem implementacji CPython.

Od time nie jest wbudowany moduł w CPython 3.4, a pierwszy katalog w sys.path jest obecny katalog skrypt from time import time próby importowania atrybut time z pliku time.py, ale nie powiedzie się i rzuca ImportError.

W CPython 3.5 timejest wbudowany moduł. Zgodnie z powyższym cytatem, uruchomienie from time import time pomyślnie importuje wbudowany moduł, bez wyszukiwania modułów na sys.path.

Obie wersje CPython podniesie ten sam błąd, jeśli cienia nie wbudowanego modułu z biblioteki standardowej, jak inspect:

[email protected]:~$ cat inspect.py 
from inspect import signature 
[email protected]:~$ python3.4 -c 'import inspect' 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "/home/me/inspect.py", line 1, in <module> 
    from inspect import signature 
ImportError: cannot import name 'signature' 
[email protected]:~$ python3.5 -c 'import inspect' 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "/home/me/inspect.py", line 1, in <module> 
    from inspect import signature 
ImportError: cannot import name 'signature'