2017-07-19 6 views
7

Python Import Abschattung scheint zwischen Version 3.4.6 und 3.5.2, anders zu sein:Python Import Shadowing unterschiedlich zwischen 3.4.6 und 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 

Frage 1: Warum ist ... diese Dinge?

Frage 2: Ist da etwas in einem Changelog? Ich kann nichts finden ...

+0

Was die Ausgabe von 'python -c‚import sys ist; print (sys.path) ''für beide Interpreter? –

+0

In beiden Fällen ist der erste Pfad eine leere Zeichenfolge. Es ist unmöglich, zu viele Zeichen einzufügen. –

Antwort

6

The documentation besagt, dass

Wenn ein Modul mit dem Namen spam importiert wird, der Interpreter sucht zuerst für ein eingebautes Modul mit diesem Namen. Wenn nicht gefunden, sucht es dann nach einer Datei mit dem Namen spam.py in einer Liste der Verzeichnisse, die von Variable sys.path angegeben werden.

(Hervorhebung von mir)

time war nicht ein eingebautes Modul Modul in Python 3.4, aber das änderte sich in Python 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 

Sie den Patch sehen können, dass die eingeführte Änderung here (bezogen auf issue 5309). Bedenkt, dass das Changelog mentions the issue 5309, aber nichts zu sagen. das time Modul, ist es sicher zu sagen, dass die Änderung ein Nebeneffekt war und ein Implementierungsdetail von CPython ist.

Da time ist kein eingebautes Modul in CPython 3.4 und das erste Verzeichnis in sys.path ist das aktuelle Skript-Verzeichnis, from time import time Versuche, das time Attribut aus time.py-Datei zu importieren, aber fehlschlägt und führt die ImportError.

In CPython 3.5 timeist ein eingebautes Modul. Laut dem obigen Zitat importiert from time import time erfolgreich das integrierte Modul, ohne nach Modulen auf sys.path zu suchen.

Beiden CPython Versionen werden die gleichen Fehler erhöhen, wenn Sie einen nicht-builtin-Modul aus der Standardbibliothek, wie inspect Schatten:

[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' 
Verwandte Themen