2014-09-26 7 views
5

Im official Python 2 tutorial heißt es:Welche Priorität hat der Import eines Namens, Submoduls oder Unterpakets aus einem Paket in Python 2.7?

Beachten Sie, dass, wenn von a_package Import an_item verwendet wird, kann das Element entweder ein Untermodul (oder subpackage) sein, das Paket oder eine andere im Paket definierten Namen, wie eine Funktion, Klasse oder Variable.

Was dann, wenn a_package hat eine subpackage namens an_item, eine Variable mit dem Namen an_item und ein Modul an_item zugleich benannt? Was ist die Priorität? Ich habe ein Experiment gemacht und das Ergebnis zeigt Priorität variable>subpackage>submodule, aber ich bin mir nicht sicher, ob es die kanonische Reihenfolge der Python-Import-Funktionalität in allen Fällen folgt.

Antwort

8

Der nächste Satz nach dem man Sie in Ihrer Frage zitieren confirms, die in einem Paket definierten Namen („Variablen“, Ihre Formulierung zu verwenden) haben Vorrang vor Submodule/packages:

Die import Erklärung ersten Tests ob der Artikel im Paket definiert ist; Wenn nicht, nimmt es an, dass es sich um ein Modul handelt, und versucht es zu laden.

Ich finde keine explizite Bestätigung in der Dokumentation für Python 2.7, dass Pakete Vorrang vor Modulen haben. Ich habe diese finden, in PEP 420:

Bei der Importverarbeitung wird die Importmaschinerie weiterhin über jedes Verzeichnis in der übergeordneten Pfad wiederholen, wie es in Python 3.2 der Fall ist. Während für ein Modul oder Paket mit dem Namen „foo“, für jedes Verzeichnis im übergeordneten Pfad suchen:

  • Wenn <directory>/foo/__init__.py gefunden wird, wird ein reguläres Paket importiert und zurückgegeben.
  • Wenn nicht, aber <directory>/foo.{py,pyc,so,pyd} gefunden wird, wird ein Modul importiert und zurückgegeben.

..., die zwar nur ausdrücklich darauf hin, dass dies das Verhalten in Python ist 3.2, genommen werden könnte bedeuten: „... und frühere Versionen von Python“. Auch dies bestätigt Ihre Feststellung, dass Pakete Vorrang vor Modulen haben.

Jedoch: wäre es eine schreckliche Idee, auf diese Implementierung Detail zu verlassen. Die Anzahl der Menschen auf der Welt, die sich dessen bewusst sind, geht wahrscheinlich nicht weit über die Kernentwickler von Python hinaus; Es ist in jeder Hinsicht undokumentiert, und es ist wahrscheinlich, dass es extrem schwierig ist, Bugs ausfindig zu machen.