Sto sviluppando un pacchetto con la seguente struttura su disco:Come si risolvono i conflitti di namespace nei miei pacchetti Python con i nomi dei pacchetti di libreria standard?
foo/
__init__.py
xml.py
bar.py
moo.py
Il pacchetto xml.py
fornisce una classe che fa un po 'di analisi XML personalizzato e traduzione per gli altri componenti del pacchetto utilizzando un parser SAX flusso. Così ha in sé:
import xml.sax
import xml.sax.handler
Ma quando vado a utilizzare in un'applicazione ottengo:
Traceback (most recent call last):
File "testxmlparser.py", line 15, in <module>
import foo.xml
File "~/code/foo/xml.py", line 39, in <module>
import xml.sax
ImportError: No module named sax
mi sembrano avere un conflitto namespace. Se cambio titolo xml.py
a qualcos'altro come xmlparser.py
tutto funziona come previsto. Ma questo sembra la cosa sbagliata da fare. Mi sento come se mi mancasse qualcosa di fondamentale riguardo i nomi dei pacchetti e la risoluzione in Python qui.
Esiste un modo corretto di fare questo lavoro che non coinvolge me rinominando il file foo/xml.py
? O è davvero l'unica soluzione ai nomi in conflitto?
Edit: La "evitare di nominare le cose lo stesso di moduli standard di Python" sembra ... well..a miniera a me. Questo è un obiettivo mobile, il set di moduli standard, che è destinato a cambiare e crescere nel tempo. Quindi, a meno che tu non abbia ottenuto veramente creativo con i tuoi nomi, le soluzioni di rinominare-cose-finché-trovi-qualcosa-che-non-conflitto non mi sembrano carenti. Inoltre, ho già un nome di pacchetto univoco con foo
(non sto usando foo
, ma qualcosa che è assolutamente unico), non dovrebbe essere sufficiente?
Il problema è 'xml.sax' non è nel mio pacchetto * *. Quindi un'importazione relativa di esso non funziona. Questo è in realtà il motivo per cui sta fallendo per me adesso. Python si aspetta che 'xml.sax' sia relativo al mio pacchetto' foo.xml', ma non lo è. –
Questo era esattamente quello che cercavo. Grazie! –