2016-01-25 8 views
8

znalazłem następującą linię w kodzie Pythona:Co robi `from six.moves import urllib` w Pythonie?

from six.moves import urllib 

Jednocześnie mogę znaleźć urllib.py wszędzie. Zauważyłem, że istnieje plik six.py w katalogu głównym paczki i ma on w środku class Module_six_moves_urllib(types.ModuleType):.

Czy to jest to? Jak to zdefiniowano?

UPDATE

Niestety jestem nowy w Pythonie i jest pytanie o składni Pythona. Dowiedziałem się, że po import jest to nazwa pliku Python bez rozszerzenia py. Gdzie jest ten plik w tym przypadku?

+0

Pytasz, do czego służy 'six.moves.urllib'? Czy przeczytałeś instrukcję? https://pythonhosted.org/six/#module-six.moves - A może chcesz się dowiedzieć, w jaki sposób jest on dokładnie zaimplementowany (w takim przypadku kod źródłowy jest dostępny ...)? – deceze

Odpowiedz

24

six to pakiet, który pomaga w pisaniu kodu, który jest kompatybilny zarówno z Python 2 i Python 3.

Jednym z problemów napotykają programiści pisząc kod python2 i 3 jest to, że nazwy kilku modułów z standardowa biblioteka uległa zmianie, mimo że funkcjonalność pozostaje taka sama.

Moduł six.moves zapewnia moduły o wspólnej nazwie zarówno dla Python2, jak i 3 (głównie poprzez zapewnienie modułu Python2 pod nazwą modułu Python 3).

Więc linia

from six.moves import urllib 

import urllib kiedy uruchamiane z Python3 i importuje mieszankę z urllib, urllib2 i urlparse z python2, naśladując struktury Python3 na urllib. Zobacz także here.

EDIT zająć aktualizację pytanie:

TLDR; W tym przypadku niekoniecznie istnieje bezpośredni związek między importowanym modułem urllib a plikiem w systemie plików. Odpowiedni plik jest dokładnie taki, na jaki wskazuje six.__file__.

Moduły stron trzecich są zdefiniowane w pliku/katalogu, który jest wymieniony w sys.path. W większości przypadków można znaleźć nazwę pliku, do którego moduł jest importowany, sprawdzając atrybut danego modułu, np. __file__. six.__file__. Jednak z six.moves rzeczy nie są tak proste, właśnie dlatego, że eksponowane moduły mogą nie odwzorowywać jeden do jednego na rzeczywiste moduły Pythona, ale zhakowane wersje tych.