2009-12-01 7 views
5

Angenommen, Sie haben die folgendeEigener Import von Unterpaketen oder nicht?

b 
b/__init__.py 
b/c 
b/c/__init__.py 
b/c/d 
b/c/d/__init__.py 

In einigen Python-Pakete, wenn Sie import b, Sie bekommen nur die in b definierten Symbole. Um auf b.c zuzugreifen, müssen Sie explizit import b.c oder from b import c. Mit anderen Worten, Sie müssen

import b 
import b.c 
import b.c.d 
print b.c.d 

In anderen Fällen sah ich einen automatischen Import aller Unterpakete. Dies bedeutet, dass der folgende Code einen Fehler nicht

import b 
print b.c.d 

produziert, weil b/__init__.py kümmert sich seine Subpackages zu importieren. Ich bevorzuge die erste (explizit besser als implizit), und ich habe es immer verwendet, aber gibt es Fälle, in denen der zweite vor dem ersten bevorzugt wird?

Antwort

5

Ich mag Namespaces - so denke ich, dass import b nur bekommen sollte, was in b selbst ist (vermutlich in b/__init__.py). Wenn es einen Grund gibt, andere Funktionen in b.c, b.c.d oder was auch immer zu trennen, dann sollte nur import b nicht alles hineinziehen - wenn die "alles hineinziehen" passiert, denke ich, dass die Namespace-Trennung wahrscheinlich ein Schein war eine, mit der ich anfangen soll. Natürlich gibt es Beispiele sogar in der Standard-Bibliothek (import os, dann können Sie os.path.join und dergleichen verwenden), aber sie sind uralt, inzwischen im Wesentlichen "grandfathered" Dinge aus der Zeit bevor das Python-Verpackungssystem ausgereift und stabil war. In neuen Code würde ich stark empfehlen, dass ein Paket sollte nicht ziehen seine Unterpakete für die Fahrt, wenn Sie es importieren. (Do import this an der Python-Eingabeaufforderung und betrachten Sie die letzte Zeile, die es zeigt ;-).

0

__all__ = [Ihre Vars, Funktionen, Klassen]

Verwenden Syntax oben in Paket bs __init__.py zum automatischen Last Dinge in dict aufgeführt. :)

Verwandte Themen