Python importazioni relativi non sono più fortemente scoraggiate, ma utilizzando absolute_import è fortemente suggerito in quel caso.
Si prega di vedere this discussion citando Guido se stesso:
"Non è per lo più storica Fino alla nuova sintassi relativa importazione è stato implementato ci sono stati vari problemi con le importazioni relative La soluzione a breve termine era?. raccomandare di non usarli La soluzione a lungo termine era quella di implementare una sintassi non ambigua.Ora è il momento di ritirare l'anti-raccomandazione.Naturalmente, senza esagerare - I tuttora li trovo un gusto acquisito, ma loro avere il loro posto"
L'OP collega correttamente la PEP 328 che dice:
Diversi casi d'uso sono stati presentati, il più importante dei quali è essere in grado di riorganizzare la struttura dei pacchetti di grandi dimensioni senza dover modificare sub -packages. Inoltre, un modulo all'interno di un pacchetto non può facilmente importazione stesso senza le importazioni relative.
vedi anche domanda quasi duplicato When or why to use relative imports in Python
Naturalmente è ancora una questione di gusti. Mentre è più facile spostare il codice con le importazioni relative, ciò potrebbe anche interrompere in modo imprevisto le cose; e rinominare le importazioni non è così difficile.
per forzare il nuovo comportamento da PEP 328 uso:
from __future__ import absolute_import
In questo caso, implicita relativa importazione non sarà più possibile (per esempio import localfile
non funziona più, solo from . import localfile
.). Per un comportamento pulito e a prova di futuro, è consigliabile utilizzare absolute_import.
Un avvertimento importante è che a causa di PEP 338 e PEP 366, le importazioni relative richiedono il file python per essere importato come modulo - non è possibile eseguire un file.py che ha un parente o di importazione si otterrà un ValueError: Attempted relative import in non-package
.
Questa limitazione deve essere presa in considerazione quando si valuta l'approccio migliore. Guido è contro gli script in esecuzione da un modulo in ogni caso:
Sono -1 su questo e su altri twiddlings proposte del macchinario __main__. L'unico caso d'uso sembra essere l'esecuzione di script che si trovano nella directory di un modulo, che ho sempre visto come antipattern. Per farmi cambiare idea, dovresti convincermi che non lo è.
Discussioni esaurienti sull'argomento possono essere trovate su SO; ri. Python 3 questo è abbastanza completo:
Sì, non c'era l'ultima volta che ho letto attraverso PEP 8! –
@Rafe, "guarda alcuni progetti ben scritti ..." qualche suggerimento? – denis
@Denis: Rietveld è il progetto di Guido van Rossum, quindi immagino che sarebbe un buon posto per guardare (http://code.google.com/p/rietveld/). La libreria standard Python non è così grande, molto di quel codice non segue le convenzioni. –