2011-09-14 27 views
11

Estoy desarrollando un paquete con la siguiente estructura en el disco:¿Cómo resuelvo los conflictos de espacio de nombres en mis paquetes de Python con nombres de paquete de biblioteca estándar?

foo/ 
    __init__.py 
    xml.py 
    bar.py 
    moo.py 

El paquete xml.py proporciona una clase que hace algo de análisis sintáctico XML personalizado y la traducción de los otros componentes del paquete utilizando un analizador SAX corriente. Por lo que tiene en él:

import xml.sax 
import xml.sax.handler 

Pero cuando voy a utilizar en una aplicación me sale:

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 

que parecen tener un conflicto de espacio de nombres. Si cambio el nombre de xml.py a otra cosa como xmlparser.py todo funciona como se esperaba. Pero esto se siente como algo incorrecto que hacer. Siento que me falta algo fundamental sobre los nombres de los paquetes y la resolución en Python aquí.

¿Hay una manera adecuada para hacer este trabajo que no implique mí cambiar el nombre del archivo foo/xml.py? ¿O es realmente esa la única solución para los nombres en conflicto?

Edición: El "evitar nombrar las cosas igual que los módulos estándar de Python" parece ... well..a pozo de extracción para mí. Ese es un objetivo en movimiento, el conjunto de módulos estándar, que seguramente cambiará y crecerá con el tiempo. Así que, a menos que obtenga realmente creativa con sus nombres, las soluciones de renombrar las cosas hasta que encuentre algo que no soluciona, me parecen malas. Además, ya lo tengo en un nombre de paquete único con foo (no estoy usando foo, pero algo que es definitivamente único), ¿no debería ser suficiente?

Respuesta

13

Como se ha mencionado over here, utilice

from __future__ import absolute_import 

y utilizar relative imports si es necesario.

+0

El problema es 'xml.sax' no está en el paquete * my *. Entonces, una importación relativa de eso no funciona. Por eso me está fallando en este momento. Python espera que 'xml.sax' sea relativo a mi paquete' foo.xml', pero no lo es. –

+0

Eso era exactamente lo que buscaba. ¡Gracias! –

Cuestiones relacionadas