Si consideri il seguente scenario:Come posso impedire agli utenti di importare x da un modulo quando esposto nel genitore utilizzando __all__
Si dispone di un modulo di
M
definitom.py
contenente una funzionef
.può essere chiamato in questo modo:
import M; M.f()
Il modulo cresce a una dimensione in cui non è pratico di avere in un unico file. Di dividere
M
fino in sottomoduliM.X
,M.Y
,M.Z
e mettere quanto segue inM/__init__.py
:from .X import * from .Y import * from .Z import * __all__ = ["f"]
Il codice originale funziona ancora:
import M; M.f()
Tuttavia, i nuovi consumatori del codice potrebbe erroneamente accedere direttamente al sottomodulo:
import M.X;
M.X.f()
Vorrei impedire questo, in modo tale che tutto il codice rimandi sempre direttamente a M, e non a nessuno dei sottomoduli.
I sottomoduli sono a vantaggio dell'organizzazione interna del codice e il riferimento a M lascia la possibilità di una facile riorganizzazione in futuro.
Un'opzione sarebbe nominare i sottomoduli _X
, _Y
e _Z
per comunicare che sono interni. È l'approccio consigliato?
Non è così. Perchè questo è un problema? Il tuo modulo funziona ancora, il codice che usa quegli elementi funziona ancora. –
Vorrei evitare questo, in modo tale che tutto il codice sia sempre rivolto direttamente a M, e non a nessuno dei sottomoduli. I sottomoduli sono a vantaggio dell'organizzazione interna del codice e il riferimento a M lascia la possibilità di una facile riorganizzazione in futuro. (Domanda modificata per includere questo dettaglio.) –
documenta il modo giusto per farlo e fidati che il tuo utente sarà abbastanza intelligente da seguire i tuoi consigli –