practices imports from example best python import

imports - ¿No deberían las importaciones ser absolutas por defecto en python27?



python import subdirectory (3)

"Absoluto" no significa el que crees que hace; en cambio, significa que se lleva a cabo el "habitual" procedimiento de resolución de paquetes: primero, busca en el directorio del paquete, luego en todos los elementos de sys.path; que incluye los elementos de PYTHONPATH.

Si realmente lo desea, puede usar herramientas como el módulo imp, pero recomendaría que no lo haga por algo como esto. Porque en general, nunca deberías tener que crear un módulo con el mismo nombre que uno en la distribución estándar de Python.

Imagina la estructura del directorio:

/ a/ __init__.py b.py c.py c.py

El archivo /a/b.py ve así:

import c should_be_absolute = c

Todos los demás archivos (incluido __init__ ) están vacíos.

Al ejecutar un script de prueba (usando Python 2.7):

import a.b print a.b.should_be_absolute

con PYTHONPATH=/ de un directorio vacío (por lo que no se agrega nada a PYTHONPATH del directorio actual) Recibo

<module ''a.c'' from ''/a/c.py''>

donde de acuerdo con PEP 328 y la declaración de import <> is always absolute , esperaría:

<module ''c'' from ''/c.py''>

La salida es la esperada cuando /a/c.py archivo /a/c.py .

¿Qué me estoy perdiendo? Y si este es el comportamiento correcto, ¿cómo importar el módulo c desde b (en lugar de ac )?

Actualizar:

Según la lista de correo de python dev , parece ser un error en la documentación. Las importaciones no son absolutas por defecto en Python27.


Si solo está agregando / a su PYTHONPATH, entonces el orden de búsqueda aún podría estar buscando c en el directorio actual. Sería mucho mejor si colocara todo en un paquete raíz y lo refiriera absolutamente:

/myPackage a/ __init__.py b.py c.py __init__.py c.py

Y un PYTHONPATH como: export PYTHONPATH=/:$PYTHONPATH

Así que en tu ac harías y de estos:

from myPackage import c from myPackage.c import Foo import myPackage.c

De esta manera, siempre es relativo a su paquete.