Motivo de la asignación a “_”

He visto esto en algunos contextos, por ejemplo,

en secuencia desempaquetado:

_, x = L.pop() # eg, L is a list of tuples 

para inicializar un contenedor:

 X = _ 

Obviamente, esto no es un elemento de la syntax formal de Python, sino que los usos que conozco parecen discrecionales.

Entonces, tengo curiosidad por saber cuál es la razón probable de su uso y cuáles son las ventajas en general (si las hay).

Nota : mi pregunta se relaciona con el uso de “_” en scripts, módulos, etc., pero no su uso en el indicador interactivo. En IDLE , el intérprete interactivo empaquetado con python, así como en ipython , “_”, se utiliza como marcador de posición para el resultado devuelto más recientemente .

Related of "Motivo de la asignación a “_”"

Lo he visto usado de dos maneras. Tanto como una variable desechable como, más comúnmente, como un contenedor de texto para la internacionalización.

Variable desechable

 name, _ = 'bida.bombu.foo'.split('.', 1) 

Aunque no lo recomendaría. Llámalo “ignorado” en su lugar.

 name, ignored = 'bida.bombu.foo'.split('.', 1) 

Es mas claro

envoltorio i18n

 from zope.i18nmessageid import MessageFactory _ = MessageFactory('my.domain') label = _("The label text") 

label será aquí un “Mensaje”, un objeto que tiene un ID de mensaje y un dominio, y cuando se represente a una interfaz de usuario (como una página web) se traducirá al idioma del usuario actual a través de un catálogo de mensajes, de modo que La etiqueta terminará en el idioma local del usuario.

_ se usa aquí porque es corto y discreto. El código resultante, _("The label text") no se ve diferente de solo una cadena, mientras que MyDomainMessage("The label text") se ve muy diferente y también es mucho más largo.

Las ventajas son que es un solo carácter y no tiene nombre.

La desventaja es que se usa con frecuencia para I18N, como referencia para gettext.gettext() .

_ es un nombre variable algo especial. En el shell, contiene el valor de la expresión evaluada previamente:

 >>> 1+2 3 >>> _+4 7 

Dentro de los scripts, se usa comúnmente como una variable desechable, es decir, una que se necesita por razones semánticas, pero que no se usará más adelante. Sintácticamente, es solo una variable como cualquier otra.

He visto la variable _ utilizada cuando no te importa qué valor obtendrá, más o menos como una variable /dev/null .

En la filosofía Python, la legibilidad es mucho más valiosa que en otros idiomas, y por ejemplo:

 x, y, _, w = getPoint() 

es compacto y más legible que otras alternativas, lo que demuestra que no le importa la coordenada z del resultado. Otros usos podrían ser

 for _ in xrange(10): print "Hello, world." 

o

 def matrix(rows, columns): return [[0] * columns for _ in xrange(rows)] 

De hecho, el lenguaje _ es un identificador válido como cualquier otro, incluso si en algunos bucles interactivos de Python tiene un significado especial.

Este uso como una “variable anónima” no es muy frecuente pero sigue ahí, por lo que puede encontrarlo en el código existente. Por ejemplo, PyChecker no informará nada sobre la función de matrix anterior, pero se quejará si utiliza un nombre de variable “normal”.

También hay paquetes que, sin embargo, le dan a _ un significado bien definido (gettext).

No hay una buena razón para usar _ en los scripts. Mientras usa el interpretador interactivo si está haciendo algún cálculo matemático, y desea obtener el resultado de la expresión anterior, puede usar _ . El tutorial de Python introduce el _ en el mismo contexto. Veo que el comportamiento se transmite de ciertos comportamientos de shell.

En tu ejemplo:

 _, x = L.pop() 

fallaría porque L.pop () devolvería un solo valor y no puede asignarlo a dos variables y tampoco es una buena idea asignar valores a _ que tiene un significado especial.