2010-05-25 21 views
7

En las cosas Obtención de gnome base de código que me topé con esta declaración de importación¿Qué significa "from MODULE import _" do python?

from GTG import _ 

y no tienen idea de lo que significa, nunca había visto esto en la documentación y un rápido así/Búsqueda de Google no se volvió a nada.

Respuesta

11

from GTG import _ importa la función _ del módulo GTG en el espacio de nombres "actual".

Normalmente, la función _ es un alias para gettext.gettext(), una función que muestra la versión traducida de un mensaje determinado. La documentación da una imagen de lo que se suele ir en otro lugar en un módulo muy, muy lejana:

import gettext 
gettext.bindtextdomain('myapplication', '/path/to/my/language/directory') 
gettext.textdomain('myapplication') 
_ = gettext.gettext 
# ... 
print _('This is a translatable string.') 
+0

Hola, gracias, esto es realmente útil. Conocía la sintaxis general "de BLA import bla", ¡así que averiguar sobre esta convención era realmente lo que estaba buscando! Usar tal taquigrafía tiene mucho más sentido ahora. Gracias – Paul

+0

@bp Uso justo. Además, leer la documentación es mucho más valioso en la cultura python que afirmar que los derechos de propiedad son ... – twneale

4

Esto importa la función/clase/módulo _ en el espacio de nombres actual. Entonces, en lugar de tener que escribir GTG._, solo tiene que escribir _ para usarlo.

Aquí es un poco de documentación:

http://docs.python.org/tutorial/modules.html#more-on-modules

Debe tenerse en cuenta que se debe utilizar esto con cuidado. Hacer esto demasiado podría contaminar el espacio de nombres actual, hacer que el código sea más difícil de leer y, posiblemente, introducir errores de tiempo de ejecución. Además, NUNCA NUNCA NUNCA debe hacer esto:

from MODULE import * 

, ya que contamina mucho el espacio de nombres actual.

Esta técnica es muy útil cuando sabe que solo va a utilizar una o dos funciones/clases/módulos de un módulo, ya que al hacerlo solo importa los activos enumerados.

Por ejemplo, si quiero usar la función imap desde el módulo de itertools, y sé que no necesitaré cualquier otro itertools funciones, podría escribir

from itertools import imap 

y sólo se podría importar la imap función.

Como he dicho antes, esto debe usarse con cuidado, ya que algunas personas pueden pensar que

import itertools 

# ... more code ... 

new_list = itertools.imap(my_func, my_list) 

es más legible que

from itertools import imap 

# ... more code ... 

new_list = imap(my_func, my_list) 

ya que deja claro exactamente qué módulo del imap la función vino de.

+8

Vale la pena mencionar que '_' no tiene un significado especial en Python, es sólo otra carta similar carácter que puede usar para nombrar una variable. –

+0

@Paul, gracias por señalar esto. Conocía la sintaxis general de 'GTG import bla', pero me confundí. Ahora, previamente pensé que tendría que haber un archivo _.py en la carpeta del paquete GTG, pero supongo que está mal. el archivo '__init__.py' en la carpeta GTG tiene la línea '_ = traducción.gettext ' así que supongo que es todo lo que _ es entonces. ¿Alguna razón para que alguien quiera nombrar una función de una manera tan extraña? – Paul

+0

@DavidZ No es completamente cierto. from fibo import * importa todos los nombres, excepto los que comienzan con un guión bajo (_). –

Cuestiones relacionadas