2014-09-26 14 views
5

W official Python 2 tutorial mówi:Jaki jest priorytet importowania nazwy, submodułu lub podpakietu z pakietu w python 2.7?

Należy pamiętać, że podczas korzystania z a_package importowej an_item, przedmiot może być albo modułem (lub Podpakiet) opakowania, lub jakaś inna nazwa zdefiniowana w pakiecie, jak funkcja, klasa lub zmienna.

A co jeśli a_package ma podpakiet nazwie an_item zmienna o nazwie an_item oraz moduł o nazwie an_item w tym samym czasie? Jaki jest priorytet? Zrobiłem eksperyment, a wynik pokazuje priorytet jako variable>subpackage>submodule, ale nie jestem pewien, czy jest to kolejność kanoniczna funkcji importowania python we wszystkich przypadkach.

Odpowiedz

8

Kolejne zdanie po jednym cytujesz w swoim pytaniu confirms że nazwy zdefiniowanej w opakowaniu („zmienne”, by użyć sformułowania) mają pierwszeństwo przed Submoduły/pakietów:

The import oświadczenie pierwsze testy czy przedmiot jest zdefiniowany w paczce; jeśli nie, zakłada, że ​​jest modułem i próbuje go załadować.

Nie mogę znaleźć wyraźnego potwierdzenia w dokumentacji dla Pythona 2.7, że pakiety mają pierwszeństwo przed modułami. I nie znaleźć ten, w PEP 420:

Podczas przetwarzania importowania maszyny import będzie nadal iteracyjne nad każdym katalogu w ścieżce dominującej jak ma to miejsce w Pythonie 3.2. Patrząc na moduł lub pakiet o nazwie „foo”, dla każdego katalogu w ścieżce dominującej:

  • Jeśli <directory>/foo/__init__.py zostanie znaleziony, regularny pakiet jest importowany i wrócił.
  • Jeśli nie, ale zostanie znalezione <directory>/foo.{py,pyc,so,pyd}, moduł zostanie zaimportowany i zwrócony.

... co, podczas gdy tylko wyraźnie stwierdza, że ​​jest to zachowanie w Pythonie 3.2, może być rozumiany w ten sposób: „... i poprzednie wersje Pythona”. Ponownie, to potwierdza twoje odkrycie, że pakiety mają pierwszeństwo przed modułami.

Jednak: Byłby to pomysł straszny polegać na tym szczegóły realizacji. Liczba ludzi na świecie, którzy są tego świadomi, prawdopodobnie nie wykracza daleko poza rdzennych programistów Pythona; jest to niedoinformowane i ma na celu wywołanie wyjątkowo trudnych do zlokalizowania błędów.