2009-07-29 17 views
11

Supongamos que tengo la siguiente estructura:Importación de archivos en Python desde __init__.py

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

a.py, b.py y c.py compartir algunas importaciones comunes (tala, os, re, etc.). ¿Es posible importar estos tres o cuatro módulos comunes del archivo __init__.py para que no tenga que importarlos en cada uno de los archivos?

Editar: Mi objetivo es evitar tener que importar 5-6 módulos en cada archivo y no está relacionado con el rendimiento.

+0

Si desea hacer esto por motivos de rendimiento, no se preocupe, la importación de módulos ya cargados es súper rápida (una simple búsqueda de dict en sys.modules). – efotinis

+0

Pregunta editada para aclarar mis motivos. –

+1

El objetivo declarado reduce un poco la legibilidad del código, ¿no crees? – Santa

Respuesta

11

No, tienen que colocarse en el espacio de nombres de cada módulo, así que tienes que importarlos de alguna manera (a menos que pases logging como argumento de función, lo que sería una manera extraña de hacer las cosas, por decir lo menos).

Pero los módulos sólo se importan vez de todos modos (y se coloca en los a, b, y c espacios de nombres), por lo que no se preocupan por el uso de demasiada memoria o algo por el estilo.

Por supuesto, puede ponerlos en un módulo separado e importar que en cada a, b, y c, pero este módulo separado aún tendrían que ser importados cada vez.

13

Puede hacerlo utilizando un archivo común como include.py, pero va en contra de las prácticas recomendadas porque implica una importación de comodines. Tenga en cuenta los siguientes archivos:

app/ 
    __init__.py 
foo/ 
    a.py 
    b.py 
    c.py 
    include.py <- put the includes here. 
    __init__.py 

Ahora, en a.py, etc., hacer:

from include import * 

Como se mencionó anteriormente, no es recomendable porque comodín-importaciones no se recomiendan.

+7

+1 para comodines. Una consistencia tonta es el duende de las mentes pequeñas. La incapacidad de agrupar las importaciones relacionadas con sensatez es una verruga pitón; por lo tanto, debe ceder el comodín. – g33kz0r

6

Sí, pero no lo hagas. En serio, no lo hagas. Pero si todavía quiere saber cómo hacerlo, se vería así:

import __init__ 

re = __init__.re 
logging = __init__.logging 
os = __init__.os 

digo que no lo haga, no sólo porque es desordenado y sin sentido, sino también porque su paquete no está realmente supone para usar __init__.py así. Es el código de inicialización del paquete.

+0

No diría que no tiene sentido. Algunas cosas que quiere aplicar a todo su código, p. 'de futura importación unicode_literals'. ¿Realmente tengo que poner eso en cada archivo (y luego olvidarlo, resultando en errores difíciles de encontrar)? – Timmmm

Cuestiones relacionadas