2009-11-09 18 views
19

De entre las diversas formas de importar código, ¿hay alguna forma de uso preferible en comparación con otras? Este enlace http://effbot.org/zone/import-confusion.htm en definitiva afirma queMejores prácticas de importación de Python (y Django)

from foo.bar import MyClass 

no es la forma preferida para importar MiClase en circunstancias normales o si no sabe lo que está haciendo. (Por el contrario, una mejor manera le gustaría:

import foo.bar as foobaralias 

y luego en el código, para acceder a MiClase utilizan

foobaralias.MyClass 

)

En resumen, parece que el enlace ha hecho referencia anteriormente es diciendo que es generalmente mejor importar todo desde un módulo, en lugar de solo partes del módulo.

Sin embargo, ese artículo que he vinculado es realmente antiguo.

También he oído que es mejor, al menos en el contexto de los proyectos de Django, importar solo las clases que desea usar, en lugar de todo el módulo. Se ha dicho que este formulario ayuda a evitar errores circulares de importación o al menos hace que el sistema de importación django sea menos frágil. Se señaló que el propio código de Django parece preferir "de x import y" a "import x".

Suponiendo que el proyecto en el que estoy trabajando no utiliza ninguna característica especial de __init__.py ... (todos nuestros archivos __init__.py están vacíos), ¿qué método de importación debería favorecer, y por qué?

Respuesta

5

Para mí, es dependiente de la situación. Si se trata de un método/clase con un nombre único (es decir, no process() o algo así), y lo va a usar un lote , guarde la escritura y simplemente haga from foo import MyClass.

Si está importando varias cosas de un módulo, probablemente sea mejor importar el módulo y hacer module.bar, module.foo, module.baz, etc., para mantener limpio el espacio de nombres.

También dijo

Se ha dicho que esta forma ayuda a evitar errores de importación circulares o al menos hace que el sistema de importación de Django menos frágil. Se señaló que el propio código de Django parece preferir "de x import y" a "import x".

No veo cómo una manera u otra ayudaría a evitar las importaciones circulares. El motivo es que incluso cuando lo hace from x import y, se importa TODO x. Solo y se lleva al espacio de nombres actual, pero se procesa todo el módulo x. Prueba este ejemplo:

En test.py, colocamos los siguientes:

def a(): 
    print "a" 

print "hi" 

def b(): 
    print "b" 

print "bye" 

Luego, en 'runme.py', puso:

from test import b 

b() 

A continuación, sólo hacer python runme.py

Verá la siguiente salida:

hi 
bye 
b 

Así que todo en test.py se ejecutó, aunque solo importó b

2

La ventaja de este último es que el origen de MyClass es más explícito. El primero coloca MyClass en el espacio de nombres actual para que el código pueda simplemente usar MyClass sin calificar. Por lo tanto, es menos obvio para alguien que lee el código donde se define MyClass.

13

Primera y primera regla de importación: nunca utilice from foo import *.

El artículo está discutiendo la cuestión de las importaciones cíclicas, que todavía existe hoy en día en código mal estructurado. No me gustan las importaciones cíclicas; su presencia es una fuerte señal de que algún módulo está haciendo demasiado y debe dividirse. Si por alguna razón necesita trabajar con código con importaciones cíclicas que no pueden ser reorganizadas, la única opción es import foo.

Para la mayoría de los casos, no hay mucha diferencia entre import foo y from foo import MyClass. Yo prefiero la segunda, porque hay menos trabajo realizar, pero hay algunas razones por las que podría utilizar la primera:

  • El módulo de clase y/valor tienen diferentes nombres. Puede ser difícil para los lectores recordar de dónde viene una importación en particular, cuando el nombre del valor importado no está relacionado con el módulo.

    • bueno: import myapp.utils as utils; utils.frobnicate()
    • bueno: import myapp.utils as U; U.frobnicate()
    • malo: from myapp.utils import frobnicate
  • va a importar una gran cantidad de valores de un módulo. Guarda tus dedos y los ojos del lector.

    • malo: from myapp.utils import frobnicate, foo, bar, baz, MyClass, SomeOtherClass, # yada yada
+0

Una excepción específica a esto podría ser en Django donde está importando una clase que implementa un modelo (que representa una tabla de base de datos). En ese caso, es preferible decir "de django.contrib.auth import User". Pero como dije, esta es una convención específica para un ambiente particular. –

+2

¿qué pasa con 'from myapp import utils; utils.frobnicate() '? – Joschua

+1

Joschua: eso está bien también, ya que cualquiera que lea podrá ver de dónde se está importando 'frobnicate'. –

Cuestiones relacionadas