Ho la seguente struttura del pacchettoPython importare uno subpackage senza altri
package
__init__.py
sub1
__init__.py
foo.py # Contains class Foo
sub2
__init__.py
bar.py # Contains class Bar
voglio essere in grado di appena import package
e hanno package.Foo
e package.Bar
, cioè voglio avere i sottopacchetti essere trasparente per gli utenti.
Il problema è che l'importazione di sub2 richiede molto tempo e molti utenti non si preoccupano affatto delle cose in sub2 e vogliono solo le cose in sub1. Quindi voglio che gli utenti possano dire import package.sub1
o from package import sub1
a solo import sub1 e saltare l'importazione di sub2.
so di poter ottenere la prima parte avendo package/__init__.py
contengono
from .sub1 import *
from .sub2 import *
e avendo package/sub1/__init__.py
essere from .foo import Foo
e allo stesso modo per sub2. Tuttavia, questo importa sempre sub1 e sub2 anche se l'utente tenta di importare solo package.sub1
.
Corrispondentemente, posso ottenere la seconda parte avendo package/__init__.py
vuoto e utilizzando lo stesso sub1/__init__.py
come sopra. Tuttavia, il solo dire import package
non carica sub1 o sub2, quindi gli utenti dovrebbero caricarli esplicitamente e quindi fare riferimento a package.sub1.Foo
.
Idealmente una soluzione funzionerebbe sia in 2.7.10 che in 3.5.0, ma accetterò l'una o l'altra se entrambe non sono possibili.
una domanda migliore è perché hai un codice di lunga durata a livello di modulo in 'sub2' – jfs
Quindi, in realtà, la tua domanda è : "Voglio' import package.sub1' per fare meno cose di un semplice 'pacchetto di importazione ', giusto? Assente qualche strano trucco come leggere il bytecode in anticipo, penso che non sia possibile.' Import AB' deve importare A' prima nota nella parte inferiore di https: // docs.python.org/3.6/library/importlib.html (ultimo blocco di codice, riga 15), 'import_module' è una funzione ricorsiva. Tuttavia, si può facilmente avere un terzo sottopackage, 'package.everything', che importerà realmente' sub1' e 'sub2' nello stesso spazio dei nomi. – Veky
@Veky: Questo è esattamente ciò che ho fatto (beh, 'package.all', ma abbastanza vicino) – Alec