2010-03-02 21 views
29

En Python, ¿qué importa exactamente import *? ¿Importa __init__.py que se encuentra en la carpeta que contiene?¿Qué importa exactamente la importación "import *"?

Por ejemplo, ¿es necesario declarar from project.model import __init__, o es from project.model import * suficiente?

+0

'from yadda.yadda import *' es más útil al piratear cosas en la línea de comando de Python, p. cuando usas Python como calculadora y simplemente escribes 'from math import *'. En un módulo, está pidiendo problemas. Además, si importa un módulo de archivo único (a diferencia de un directorio), 'from ... import *' no importará símbolos cuyos nombres comiencen con '_'. –

Respuesta

38

La "ventaja" de from xyz import * a diferencia de otras formas de importación es que importa todo (bueno, casi ... [ver (a) a continuación] todo) desde el módulo designado de conformidad con el módulo actual. Esto permite usar los diversos objetos (variables, clases, métodos ...) del módulo importado sin ponerles el prefijo.Por ejemplo

>>> from math import * 
>>>pi 
3.141592653589793 
>>>sin(pi/2) 
>>>1.0 

Esta práctica (de importación * en el espacio de nombres actual) es sin embargo desalentado porque que

  • ofrece la oportunidad para que las colisiones de espacio de nombres (por ejemplo, si usted tenía un nombre de variable pi antes de la importación)
  • puede ser ineficaz, si la cantidad de objetos importados es grande.
  • no documenta explícitamente el origen de la variable/método/clase (que es bueno tener esta "auto-documentación" del programa para la futura visita en el código)

Típicamente por lo tanto, limitar esta importación * la práctica de pruebas ad-hoc y similares, y en su lugar:

importar explícitamente unos objetos sólo

>>>from math import pi 
>>>pi 
>>>3.141592653589793 
>>> sin(pi/2) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'sin' is not defined 

o importar el mod ule bajo su propio espacio de nombres (o un alias de los mismos, en particular si este es un nombre largo, y el programa hace referencia a sus objetos muchas veces)

>>>import math 
    >>>math.pi 
    >>>3.141592653589793 
    etc.. 


    >>>import math as m #bad example math being so short and standard... 
    >>>m.pi 
    >>>3.141592653589793 
    etc.. 

Véase el Python documentation on this topic

(a) Específicamente, lo que se importa con from xyz import * si el módulo xyz define una variable __all__, importará todos los nombres definidos en esta secuencia, de lo contrario importará todos los nombres, excepto estos que comienzan con un guión bajo.

+7

La ventaja de 'from X import *' es que te permite ser flojo. El problema es que te morderá en el culo por perezoso :) – voyager

+1

Algunos módulos (como ['pygame'] (http://www.pygame.org/docs/ref/locals.html), pero muchos otros) tienen un submódulo especial que se debe importar como '*'. Dichos módulos especiales generalmente tienen constantes o funciones comúnmente utilizadas. –

+0

Entonces, básicamente, puedo importar todo sin tener una colisión de espacio de nombres si utilizo 'import math' en lugar de' from math import * '? –

3

Sí, lo hace. Importa todo (que no es una variable privada, es decir: variables cuyos nombres comienzan con _ o __), y debe intentar no usarlo de acuerdo con "Properly importing modules in Python" para evitar contaminar el espacio de nombres local.

Es suficiente, pero por lo general se debe o bien hacer import project.model, que ya importa __init__.py, por "Understanding python imports", pero puede ser demasiado prolijos si lo usa demasiado, o import project.model as pm o import project.model as model para ahorrar unos cuantos golpes de teclado más adelante, cuando Tú lo usas. El consejo de

Seguir Alex en "What exactly does "import *" import?"

+6

Buena recomendación, pero información imprecisa: 'from foo import *' does ** not ** "import everything" - importa los nombres listados en el atributo ''______' del módulo, o, faltando ese atributo, _nombres no privados_ (excluyendo nombres que comienzan con '_'). –

+0

@Alex, buen punto. ¿Le gustaría expandirlo, o prefiere que lo haga? – voyager

+0

Ya lo he ampliado. Consulte mi respuesta a esta pregunta. –

2

Si project.model es un paquete, el módulo mencionado por import project.model es de .../project/model/__init__.py. from project.model import * volca todo desde el espacio de nombre __init__.py en el tuyo. No hace nada automáticamente con los otros módulos en el modelo. El estilo preferido es __init__.py para no contener nada.

Nunca jamás use import *. Hace que tu código sea ilegible e imposible de mantener.

1

Si el módulo en cuestión (project.model en su caso) ha definido una lista de picaduras llamada __all__, entonces se importan todas las variables nombradas en esa lista. Si no existe tal variable, importa todo.

10

Importa (en el espacio de nombre actual) los nombres que el módulo (o paquete) enumera en su atributo __all__ - faltando tal atributo, todos los nombres que no comienzan con _.

Está pensado principalmente como un atajo útil para usar solo en sesiones interactivas de intérprete: como otras respuestas sugieren, no lo use en un programa.

Mi recomendación, por Google's Python style guide, es importar solamente siempre módulos, no clases o funciones (u otros nombres) desde dentro de los módulos. Seguir estrictamente esto permite mayor claridad y precisión, y evita trampas sutiles que pueden surgir al importar "cosas de un módulo".

La importación de un paquete (o cualquier cosa desde adentro) carga y ejecuta intrínsecamente el paquete __init__.py - ese archivo define el cuerpo del paquete. Sin embargo, no vincula el nombre __init__ en su espacio de nombre actual (por lo que en este sentido no importa ese nombre).

+0

Entonces, básicamente, puedo importar todo sin tener una colisión de espacio de nombres si utilizo 'import math' en lugar de' from math import * '? –

Cuestiones relacionadas