2011-03-10 6 views
33

Creé un módulo llamado util que proporciona clases y funciones que a menudo uso en Python. Algunos de ellos necesitan funciones importadas. ¿Cuáles son los pros y los contras de importar cosas necesarias dentro de la definición de clase/función? ¿Es mejor que import al comienzo de un archivo de módulo? ¿Es una buena idea?Instrucción de importación dentro de la definición de clase/función: ¿es una buena idea?

+1

posible duplicado de [buena o mala práctica en Python: import en medio de un archivo] (http://stackoverflow.com/questions/1188640/good-or-bad-practice-in- python-import-in-the-middle-of-a-file) –

Respuesta

37

Es el estilo más común para poner todos los import al principio del archivo. PEP 8 lo recomienda, que es una buena razón para hacerlo para empezar. Pero eso no es un capricho, tiene ventajas (aunque no lo suficientemente crítico como para hacer que todo lo demás sea un crimen). Permite encontrar todas las importaciones de un vistazo, en lugar de buscar en todo el archivo. También garantiza que todo se importe antes de que se ejecute cualquier otro código (que puede depender de algunas importaciones). NameError s son generalmente fáciles de resolver, pero pueden ser molestos.

No se debe evitar la contaminación (significativa) del espacio de nombres manteniendo el módulo en un alcance menor, ya que todo lo que se agrega es el módulo real (no, import * doesn't count and probably shouldn't be used anyway). Dentro de las funciones, importaría de nuevo en cada llamada (no es realmente dañino ya que todo se importa una vez, pero no se requiere).

+0

Cambié mi elección a esta respuesta. Lo analicé y es el mejor hasta ahora. –

+0

Creo que el mejor argumento para esto es: si importa el archivo, desea verificar en la importación si tiene todos los paquetes correctos, no en el punto en que utilizará una determinada función. Por supuesto, podría ser que no necesites todos los paquetes (supongo que este es el inconveniente) –

2

Creo que es una buena práctica (de acuerdo con algunos PEP) que guarde las declaraciones de importación al comienzo de un módulo. Puede agregar instrucciones de importación a un archivo __init__.py, que importará esos módulos a todos los módulos dentro del paquete.

Entonces ... ciertamente es algo que puede hacer de la forma en que lo hace, pero está desaconsejado y realmente innecesario.

12

PEP8, la guía de estilo de Python, establece que:

importaciones siempre se colocan en la parte superior de el archivo, justo después de cualquier módulo comentarios y cadenas de documentación, y antes de variables globales del módulo y constantes.

Por supuesto, esta no es una regla difícil y rápida, y las importaciones pueden ir a donde usted desee. Pero ponerlos en la parte superior es la mejor manera de hacerlo. Por supuesto, puede importar dentro de funciones o una clase.

Pero tenga en cuenta que no se puede hacer esto:

def foo(): 
    from os import * 

Porque:

SyntaxWarning: import * only allowed at module level 
+0

Cuando coloco declaraciones de importación al comienzo del módulo, y luego uso este módulo en un archivo diferente y llamo 'dir (util)' en él, vea no solo los nombres de las funciones/clases que definí dentro de 'util.py' sino también' imports' que se crean allí. ¿Esta bien? –

+0

Sí, porque 'import' ejecuta todas las declaraciones en el archivo fuente cargado. Entonces, supongamos que hay un módulo 'X' que importa' Y'. Ahora cuando importamos 'X' en otro módulo,' Y' también se importa. – user225312

+0

Solo pensé que viola la encapsulación ya que cualquiera tiene acceso a la implementación (obtiene información sobre los módulos que utilicé). –

2

Mientras que las otras respuestas son en su mayoría correctas, hay una razón por la cual Python lo permite.

No es inteligente importar material redundante que no es necesario. Entonces, si quiere, por ejemplo, analizar XML en un árbol de elementos, pero no desea utilizar el analizador XML lento incorporado si lxml está disponible, deberá verificarlo en el momento en que necesite invocar el analizador.

Y en lugar de memorizar la disponibilidad de lxml al principio, yo preferiría try la importación y el uso de lxml, except no está ahí, en cuyo caso habría que vuelve a los del módulo incorporado xml.

1

Al igual que la respuesta de flying sheep, estoy de acuerdo en que los otros tienen razón, pero pongo las importaciones en otros lugares como en las rutinas __init__() y las llamadas a funciones cuando DESARROLLO el código. Después de que mi clase o función ha sido probada y comprobada para trabajar con la importación dentro de ella, normalmente le doy su propio módulo con la importación siguiendo las pautas PEP8. Lo hago porque a veces me olvido de eliminar las importaciones después de refactorizar el código o eliminar el código anterior con malas ideas. Al mantener las importaciones dentro de la clase o función en desarrollo, estoy especificando sus dependencias si quiero copiarlo en otro lugar o promocionarlo a su propio módulo ...

0

Solo mueva las importaciones a un ámbito local, como dentro de una definición de función, si es necesario para resolver un problema, como evitar una importación circular o intentar reducir el tiempo de inicialización de un módulo. Esta técnica es especialmente útil si muchas de las importaciones son innecesarias dependiendo de cómo se ejecuta el programa. También puede mover las importaciones a una función si los módulos solo se usan alguna vez en esa función. Tenga en cuenta que cargar un módulo la primera vez puede ser costoso debido a la inicialización única del módulo, pero cargar un módulo varias veces es prácticamente gratuito, lo que cuesta solo un par de búsquedas en el diccionario. Incluso si el nombre del módulo ha salido del alcance, el módulo probablemente esté disponible en sys.modules.

https://docs.python.org/3/faq/programming.html#what-are-the-best-practices-for-using-import-in-a-module

Cuestiones relacionadas