53 votos

¿Cuáles son las buenas reglas de oro para Python importaciones?

Estoy un poco confundido con la multitud de maneras en que usted puede importar los módulos en Python.

import X
import X as Y
from A import B

He estado leyendo acerca del alcance y de los espacios de nombres, pero me gustaría algunos consejos prácticos sobre cuál es la mejor estrategia, en qué circunstancias y por qué. Debe importaciones suceder en un nivel de módulo o de un método/función de nivel? En la __init__.py o en el módulo de código de sí mismo?

Mi pregunta no es contestado por "paquetes de Python - importación por parte de la clase, no el archivo" aunque obviamente está relacionado.

49voto

DzinX Puntos 13452

En el código de producción en nuestra empresa, tratamos de seguir las siguientes reglas.

Ponemos las importaciones en el principio del archivo, justo después de que el archivo principal del docstring, por ejemplo:

"""
Registry related functionality.
"""
import wx
# ...

Ahora, si vamos a importar una clase que es uno de los pocos en el módulo importado, vamos a importar directamente el nombre, para que en el código sólo tenemos que utilizar la última parte, por ejemplo:

from RegistryController import RegistryController
from ui.windows.lists import ListCtrl, DynamicListCtrl

Existen módulos, sin embargo, que contienen docenas de clases, por ejemplo, la lista de todas las posibles excepciones. Luego importamos el módulo de sí mismo y de referencia en el código:

from main.core import Exceptions
# ...
raise Exceptions.FileNotFound()

Utilizamos la import X as Y como pocas veces como sea posible, porque hace que la búsqueda por el uso de un determinado módulo o clase difícil. A veces, sin embargo, usted tiene que utilizar si desea importar dos clases que tienen el mismo nombre, pero existen en los diferentes módulos, por ejemplo:

from Queue import Queue
from main.core.MessageQueue import Queue as MessageQueue

Como regla general, no hacemos las importaciones dentro de los métodos, ya que simplemente hacer que el código sea más lento y menos legible. Algunos pueden encontrar este una buena manera de resolver fácilmente cíclico de las importaciones problema, pero la mejor solución es el código de reorganización.

25voto

Permítanme simplemente pegar una parte de la conversación en django-dev lista de correo iniciado por Guido van Rossum:

[...] Por ejemplo, es parte de Google Python guías de estilo[1] que todos los las importaciones deben importar un módulo, no una clase o función de que el módulo. Hay más clases y funciones que hay los módulos, así que recordando cuando un particular de la cosa viene de mucho más fácil si se antepone el nombre de un módulo. A menudo, varios módulos pasar a definir las cosas con el mismo nombre, de modo que el lector del código de no tiene que ir de nuevo a la parte superior del archivo para ver de que módulo de un determinado nombre es importado.

Fuente: http://groups.google.com/group/django-developers/browse_thread/thread/78975372cdfb7d1a

1: http://code.google.com/p/soc/wiki/PythonStyleGuide#Module_and_package_imports

9voto

user18044 Puntos 1567

Yo normalmente uso import X en el nivel de módulo. Si sólo necesita un único objeto de un módulo, utilice from X import Y.

Sólo uso import X as Y en caso de que usted esté de lo contrario, se enfrenta con un nombre de choque.

Yo sólo uso las importaciones en función del nivel de importar cosas que necesitan, cuando el módulo se utiliza como el módulo principal, como:

def main():
  import sys
  if len(sys.argv) > 1:
     pass

HTH

3voto

Jason Baker Puntos 56682

NO hacer esto:

from X import *

a menos que esté absolutamente seguro de que usted va a utilizar cada uno y cada cosa en ese módulo. E incluso entonces, usted probablemente debería reconsiderar el uso de un enfoque diferente.

Aparte de eso, es sólo una cuestión de estilo.

from X import Y

es bueno y le ahorra un montón de tiempo escribiendo. Yo tiendo a usar que cuando estoy usando algo en ella con bastante frecuencia, Pero si va a importar mucho de ese módulo, usted podría terminar con una sentencia de importación que se parece a esto:

from X import A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P

Usted consigue la idea. Eso es cuando las importaciones como

import X

llegar a ser útiles. O eso, o si realmente no estoy usando nada en X muy frecuentemente.

2voto

dbr Puntos 66401

Normalmente intento utilizar de forma regular import modulename, a menos que el nombre del módulo es largo, o se utiliza a menudo..

Por ejemplo, me gustaría hacer..

from BeautifulSoup import BeautifulStoneSoup as BSS

..así que puedo hacer soup = BSS(html) en lugar de BeautifulSoup.BeautifulStoneSoup(html)

O..

from xmpp import XmppClientBase

..en vez de importar la totalidad de xmpp, cuando yo sólo uso el XmppClientBase

El uso de import x as y es útil si desea importar muy largas nombres de método , o para evitar clobbering existente de importación/variable/clase/método (algo que usted debe tratar de evitar por completo, pero no siempre es posible)

Supongamos que queremos ejecutar una función main() de otro script, pero ya tengo una función main ()..

from my_other_module import main as other_module_main

..no le reemplazar mi main función con my_other_module s main

Ah, una cosa - no hagas from x import * - que hace que su código muy difícil de entender, como usted puede ver fácilmente donde un método de vino de (from x import *; from y import *; my_func() - donde se my_func definido?)

En todos los casos, usted podría simplemente hacer import modulename y, a continuación, hacer modulename.subthing1.subthing2.method("test")...

El from x import y as z cosas es puramente para la comodidad de uso cada vez que voy a hacer el código más fácil de leer o de escribir!

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X