Le importazioni relative di Python non sono più fortemente scoraggiate, ma in questo caso è fortemente consigliato l'uso di absolute_import.
Si prega di vedere questa discussione citando lo stesso Guido:
"Non è per lo più storico? Fino all'implementazione della nuova sintassi di importazione relativa c'erano vari problemi con le importazioni relative. La soluzione a breve termine era raccomandare di non usarli. La soluzione a lungo termine era implementare una sintassi univoca. Ora è ora di ritirare l'anti-raccomandazione. Naturalmente, senza esagerare, trovo ancora un gusto acquisito; ma hanno il loro posto ".
L'OP collega correttamente il PEP 328 che dice:
Sono stati presentati diversi casi d'uso, il più importante dei quali è la possibilità di riorganizzare la struttura di grandi pacchetti senza dover modificare i sotto-pacchetti. Inoltre, un modulo all'interno di un pacchetto non può importare facilmente se stesso senza importazioni relative.
Vedi anche la domanda quasi duplicata Quando o perché usare le importazioni relative in Python
Ovviamente è ancora una questione di gusti. Sebbene sia più facile spostare il codice con le importazioni relative, ciò potrebbe anche interrompere inaspettatamente le cose; e rinominare le importazioni non è così difficile.
Per forzare il nuovo comportamento da PEP 328 utilizzare:
from __future__ import absolute_import
In questo caso, l'importazione relativa implicita non sarà più possibile (es. import localfile
Non funzionerà più, solo from . import localfile
). Per un comportamento pulito ea prova di futuro, è consigliabile utilizzare absolute_import.
Un avvertimento importante è che a causa di PEP 338 e PEP 366 , le importazioni relative richiedono che il file python venga importato come modulo: non è possibile eseguire un file.py con un'importazione relativa o si otterrà un file ValueError: Attempted relative import in non-package
.
Questa limitazione dovrebbe essere presa in considerazione quando si valuta l'approccio migliore. Guido è contro l'esecuzione di script da un modulo in ogni caso:
Sono -1 su questo e su qualsiasi altra proposta di twiddling della macchina __main__. L'unico caso d'uso sembra essere l'esecuzione di script che si trovano all'interno della directory di un modulo, che ho sempre visto come un antipattern. Per farmi cambiare idea dovresti convincermi che non lo è.
Discussioni esaustive sull'argomento possono essere trovate su SO; ri. Python 3 questo è abbastanza completo:
from _ import ...
, quindi i tuoi esempi sarebberofrom .. import A
efrom . import B