Ich habe Struktur das folgende PaketPython importieren eine subpackage ohne andere
package
__init__.py
sub1
__init__.py
foo.py # Contains class Foo
sub2
__init__.py
bar.py # Contains class Bar
Ich möchte in der Lage, nur import package
und package.Foo
und package.Bar
haben, das heißt ich die Subpackages für die Nutzer transparent sein haben wollen.
Der Catch ist, dass der Import von Sub2 eine lange Zeit dauert, und viele Benutzer kümmern sich überhaupt nicht um die Sachen in Sub2 und wollen nur die Sachen in Sub1. So möchte ich Benutzer in der Lage sein zu sagen import package.sub1
oder from package import sub1
zu nur importieren Sie Sub1 und überspringen Sie den Import von Sub2.
Ich weiß, dass ich den ersten Teil package/__init__.py
, indem er erreichen kann enthalten
from .sub1 import *
from .sub2 import *
und package/sub1/__init__.py
from .foo import Foo
sein mit und in ähnlicher Weise für sub2. Dies führt jedoch dazu, dass Sub1 und Sub2 immer importiert werden, auch wenn der Benutzer nur versucht, package.sub1
zu importieren.
Entsprechend kann ich den zweiten Teil erreichen, indem package/__init__.py
leer sein und denselben sub1/__init__.py
wie oben verwenden. Wenn Sie jedoch nur import package
sagen, wird Sub1 oder Sub2 nicht geladen, sodass Benutzer sie explizit laden müssen und dann auf package.sub1.Foo
verweisen müssen.
Im Idealfall würde eine Lösung sowohl in 2.7.10 und 3.5.0 funktionieren, aber ich werde das eine oder das andere akzeptieren, wenn beides nicht möglich ist.
eine bessere Frage zu machen, warum haben Sie einen lang laufenden Code auf der Modulebene in 'sub2' – jfs
Also, in der Tat ist Ihre Frage : "Ich möchte' import package1 'weniger tun, als '' import package'', oder? Es fehlt ein seltsamer hack wie das Lesen des Bytecodes im Voraus, ich denke, das ist nicht möglich. 'Import AB' muss 'Import A' Hinweis: Am Ende von https: // docs.python.org/3.6/library/importlib.html (letzter Codeblock, Zeile 15), 'import_module' ist eine rekursive Funktion. Sie können jedoch leicht ein drittes Unterpaket "package.everything" erstellen, das "sub1" und "sub2" in denselben Namespace importiert. – Veky
@Veky: Das ist tatsächlich genau das, was ich getan habe (naja, 'package.all', aber nahe genug) – Alec