2016-01-25 3 views
8

Ich fand die folgende Zeile in Python-Code:Was macht `` six.moves Import von Urllib 'in Python?

from six.moves import urllib 

Gleichzeitig kann ich urllib.py überall finden. Ich fand, dass es eine Datei six.py im Paket root gibt und es class Module_six_moves_urllib(types.ModuleType): innen hat.

Ist es das? Wie ist das definiert?

UPDATE

Sorry, ich bin neu in Python und die Frage ist, über Python-Syntax. Ich habe gelernt, dass was nach import Python-Dateiname ohne eine py Erweiterung ist. Also, wo ist diese Datei in diesem Fall?

+0

Fragen Sie, was 'six.moves.urllib' für? Hast du das Handbuch gelesen? https://pythonhosted.org/six/#module-six.moves - Oder wollen Sie wissen, wie es genau implementiert ist (in welchem ​​Fall der Quellcode verfügbar ist ...)? – deceze

Antwort

24

six ist ein Paket, das in dem Schreiben von Code hilft, das sowohl mit Python 2 und Python 3.

Eines der Probleme ist kompatibel Entwickler konfrontiert werden, wenn Code für Python2 Schreiben und 3 ist, dass die Namen von mehreren Modulen aus dem Standardbibliothek haben sich geändert, obwohl die Funktionalität gleich bleibt.

Das Modul six.moves stellt diese Module unter einem gemeinsamen Namen für Python2 und 3 zur Verfügung (meist indem das Python2-Modul unter dem Namen des Python 3-Moduls bereitgestellt wird).

So Ihre Linie

from six.moves import urllib 

Importe urllib, wenn sie mit Python3 laufen und importiert eine Mischung aus urllib, urllib2 und urlparse mit Python2, urllib die Struktur der Python3 des nachahmt. Siehe auch here.

EDIT die Aktualisierung der Frage zu beantworten:

TLDR; Es besteht nicht unbedingt eine direkte Beziehung zwischen dem importierten Modul urllib und einer Datei auf dem Dateisystem in diesem Fall. Die relevante Datei ist genau das, was six.__file__ zeigt.

Module von Drittanbietern werden in einer Datei/Verzeichnis definiert, das in sys.path aufgeführt ist. Die meiste Zeit können Sie den Namen der Datei finden, aus der ein Modul importiert wird, indem Sie das Attribut __file__ des fraglichen Moduls prüfen, z. six.__file__. Allerdings sind die Dinge mit six.moves nicht so einfach, gerade weil die exponierten Module tatsächlich nicht eins zu eins mit tatsächlichen Python-Modulen abbilden, sondern gehackte Versionen von diesen.