2016-01-25 13 views
8

ho trovato la seguente riga di codice Python:Che cosa significa "da sei.move importare urllib` do in Python?

from six.moves import urllib 

Contemporaneamente, posso trovare urllib.py da nessuna parte. Ho trovato un file six.py nella radice del pacchetto e contiene class Module_six_moves_urllib(types.ModuleType): all'interno.

È questo? Come è definito?

UPDATE

mi dispiace nuovo a Python e la domanda è sulla sintassi Python. Ho appreso che quello che è dopo import è il nome del file Python senza l'estensione py. Quindi, dov'è questo file in questo caso?

+0

Stai chiedendo a cosa serve "six.moves.urllib"? Hai letto il manuale? https://pythonhosted.org/six/#module-six.moves - O vuoi sapere come è implementato esattamente (nel qual caso il codice sorgente è disponibile ...)? – deceze

risposta

24

six è un pacchetto che aiuta nel codice scrittura che è compatibile sia con Python 2 e Python 3.

Uno dei problemi sviluppatori incontrano quando si scrive codice per python2 e 3 è che i nomi di diversi moduli dalla le librerie standard sono cambiate, anche se la funzionalità rimane la stessa.

Il modulo six.moves fornisce quei moduli sotto un nome comune per entrambi Python2 e 3 (principalmente fornendo il modulo Python2 sotto il nome del modulo Python 3).

Quindi la vostra linea

from six.moves import urllib 

importazioni urllib quando eseguito con python3 e importa una miscela di urllib, urllib2 e urlparse con python2, imitando la struttura del python3 di urllib. Vedi anche here.

EDIT per affrontare l'aggiornamento della domanda:

TLDR; In questo caso non esiste necessariamente una relazione diretta tra il modulo importato urllib e un file sul filesystem. Il file pertinente è esattamente ciò che indica six.__file__.

I moduli di terze parti sono definiti in un file/directory che è elencato in sys.path. Nella maggior parte dei casi è possibile trovare il nome del file dal quale viene importato un modulo controllando l'attributo __file__ del modulo in questione, ad es. six.__file__. Tuttavia con six.moves le cose non sono così semplici, proprio perché i moduli esposti potrebbero non mappare effettivamente uno a uno con i veri moduli Python ma con versioni compromesse.