2012-04-07 23 views
5

estaba leyendo el sourcode para un proyecto de pitón y me encontré con la siguiente línea:de objetos Python Importación que se origina en un módulo de un módulo diferente en un tercer módulo

from couchexport.export import Format 

(fuente: https://github.com/wbnigeria/couchexport/blob/master/couchexport/views.py#L1)

Fui a couchexport/export.py para ver qué era Format (¿Clase? Dict? Algo más?). Desafortunadamente Format no está en ese archivo. export.py importa sin embargo un Format desde couchexport.models donde hay es una clase Format (fuente: https://github.com/wbnigeria/couchexport/blob/master/couchexport/models.py#L11).

Cuando abro el archivo original en mi IDE y hago que busque la declaración, en la línea que mencioné al comienzo de esta pregunta, conduce directamente a models.py.

¿Qué está pasando? ¿Cómo puede una importación desde un archivo (export.py) ser una importación desde otro archivo (models.py) sin especificarse explícitamente?

Respuesta

16

Si el módulo a hace un from b import Foo, entonces Foo es miembro de a después y accesible como a.Foo. Solo es consecuente que ahora también puede importarlo usando from a import Foo.

Esto se usa comúnmente si tiene una biblioteca grande distribuida en varios archivos y desea que se pueda acceder desde una sola ubicación. Digamos que usted tiene un paquete de foo con la siguiente distribución:

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

a.py, b.py, c.py, definen las clases A, B y C, respectivamente.

Si desea utilizar estas clases, que normalmente tiene que escribir

from foo.a import A 
from foo.b import B 
from foo.c import C 

Esto tiene al menos dos problemas:

    se necesita
  1. Gran parte del código (tres líneas) para este sencillo import
  2. El autor de la biblioteca ya no puede cambiar la asociación de archivo/clase después, porque eso rompería el código existente.

por lo que normalmente sólo hay que poner lo siguiente en el __init__.py:

from a import A 
from b import B 
from c import C 

Ahora que poner todas las piezas juntas en un solo lugar y todas las clases son accesibles con un simple importación:

from foo import A,B,C 
+0

No estoy seguro de qué problema está diciendo # 1. – DSM

+0

@DSM: aclarado :) –

+0

Pensé que podría ser un modismo no traducido, pero dado que 'type' también significa algo en Python, no estaba seguro. : ^) – DSM

Cuestiones relacionadas