2011-06-01 20 views
5

Estoy importando una gran cantidad de diferentes secuencias de comandos, por lo que en la parte superior de mi archivo que se llena de declaraciones de importación, es decir:Python: Importación de un "archivo de importación"

from somewhere.fileA import ... 
from somewhere.fileB import ... 
from somewhere.fileC import ... 
... 

¿Hay una manera de mover todo de estos en otro lugar y luego todo lo que tengo que hacer es importar ese archivo, ¿así que es solo una importación limpia?

Respuesta

4

Por supuesto que sí; simplemente cree un archivo llamado myimports.py en el mismo directorio donde está su archivo principal y coloque allí sus importaciones. Luego, simplemente puede usar from myimports import * en su secuencia de comandos principal.

+2

Tenga en cuenta que esto no debe hacerse excepto en circunstancias especiales y si puede garantizar al 100% que no se sombrea ni un solo nombre. Consulte http://docs.python.org/howto/doanddont.html#from-module-import – delnan

+0

Sí, por supuesto; esta no es una práctica de codificación que defendería en ninguna circunstancia, pero ¿quién soy para cuestionar la intención del afiche? :) –

+2

Es común (y bueno para todos los involucrados) responder "Cómo hacer " con "¿Qué es X exactamente? ... Ah, sí. Puedes hacerlo mejor así: .. . " – delnan

11

Le recomiendo que no haga lo que quiere hacer. Usted está haciendo el global include file mistake again. Aunque solo un módulo está importando todos sus módulos (a diferencia de todos los módulos que importan el global), el punto restante es que si hay una razón válida para que todos esos módulos se recopilen bajo un nombre común, bien. Si no hay ninguna razón, entonces deben mantenerse separados. El motivo es la documentación. Si abro su archivo y veo solo una importación, no obtengo ninguna información sobre qué se importa y de dónde proviene. Si, por otro lado, tengo la lista de importaciones, sé de un vistazo qué se necesita y qué no.

Además, hay otro error importante que supongo que está haciendo. Cuando usted dice

from somewhere.fileA import ... 
from somewhere.fileB import ... 
from somewhere.fileC import ... 

supongo que va a importar, por ejemplo, una clase, como este

from somewhere.fileA import MyClass 

esto está mal. Esta solución alternativa es mucho mejor

from somewhere import fileA 

<later> 

a=fileA.MyClass() 

¿Por qué? dos razones: primero, espacios de nombres. Si tienes dos módulos con una clase llamada MyClass, tendrías un enfrentamiento. Segundo, documentación. Supongamos que utiliza la primera opción, y me encuentro en el código de la línea

a=MyClass() 

siguiente ahora no tengo ni idea de donde esta MiClase viene, y tendré de grep todos sus archivos con el fin de encontrarlo. Tenerlo calificado con el nombre del módulo me permite comprender de inmediato de dónde viene, y encontrar de inmediato, a través de una/búsqueda, donde se utilizan elementos provenientes del módulo fileA en su programa.

Nota final: cuando dice "archivo A", está cometiendo un error. Hay módulos (o paquetes), no archivos. Los módulos se asignan a los archivos, y los paquetes se asignan a los directorios, pero también pueden asignarse a los archivos huevo, e incluso puede crear un módulo que no tenga ningún archivo. Esto es nombrar conceptos, y es un problema lateral.