¿Las declaraciones de importación deberían estar siempre en la parte superior de un módulo?

Resuelto Adam J. Forster asked hace 15 años • 22 respuestas

PEP 8 establece:

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

Sin embargo, si la clase/método/función que estoy importando solo se usa en casos excepcionales, ¿seguramente es más eficiente realizar la importación cuando sea necesario?

¿No es esto?

class SomeClass(object):

    def not_often_called(self)
        from datetime import datetime
        self.datetime = datetime.now()

¿Más eficiente que esto?

from datetime import datetime

class SomeClass(object):

    def not_often_called(self)
        self.datetime = datetime.now()
Adam J. Forster avatar Sep 25 '08 00:09 Adam J. Forster
Aceptado

La importación de módulos es bastante rápida, pero no instantánea. Esto significa que:

  • Poner las importaciones en la parte superior del módulo está bien, porque es un costo trivial que sólo se paga una vez.
  • Poner las importaciones dentro de una función hará que las llamadas a esa función demoren más.

Entonces, si le importa la eficiencia, coloque las importaciones en primer lugar. Solo muévalos a una función si tu perfil muestra que eso ayudaría (hiciste un perfil para ver dónde mejorar mejor el rendimiento, ¿verdad?)


Las mejores razones que he visto para realizar importaciones diferidas son:

  • Soporte de biblioteca opcional. Si su código tiene varias rutas que utilizan diferentes bibliotecas, no lo interrumpa si no hay una biblioteca opcional instalada.
  • En el caso __init__.pyde un complemento, que puede importarse pero no usarse realmente. Algunos ejemplos son los complementos de Bazaar, que utilizan bzrlibel marco de carga diferida de.
John Millikin avatar Sep 24 '2008 17:09 John Millikin

Poner la declaración de importación dentro de una función puede evitar dependencias circulares. Por ejemplo, si tiene 2 módulos, X.py e Y.py, y ambos necesitan importarse entre sí, esto provocará una dependencia circular cuando importe uno de los módulos, lo que provocará un bucle infinito. Si mueve la declaración de importación en uno de los módulos, entonces no intentará importar el otro módulo hasta que se llame a la función, y ese módulo ya estará importado, por lo que no habrá un bucle infinito. Lea aquí para obtener más información: effbot.org/zone/import-confusion.htm

Moe avatar Sep 24 '2008 20:09 Moe