¿Cuál es el propósito de la variable de subrayado único "_" en Python?


618

¿Cuál es el significado de _después foren este código?

if tbh.bag:
   n = 0
   for _ in tbh.bag.atom_set():
      n += 1


55
Para su caso, sería más limpio len(tbh.bag.atom_set())(si el valor devuelto tiene un __len__método) osum(1 for _ in tbh.bag.atom_set())
Nick T

En pylintotra opción para nombres de variable ficticios hay un prefijo dummy_para el nombre de la variable. Al usar este prefijo con pylint, pylintno se emite una advertencia. También puede configurar el patrón variable ficticio para pylintacomodar cosas como __.
Trevor Boyd Smith

Respuestas:


781

_ tiene 4 usos convencionales principales en Python:

  1. Para mantener el resultado de la última expresión ejecutada (/ instrucción) en una sesión de intérprete interactiva. Este precedente fue establecido por el intérprete estándar de CPython, y otros intérpretes han seguido su ejemplo.
  2. Para la búsqueda de traducción en i18n (consulte la documentación de gettext , por ejemplo), como en código como: raise forms.ValidationError(_("Please enter a correct username"))
  3. Como un propósito general "usar y tirar" nombre de la variable para indicar que parte de un resultado de la función está siendo ignorada deliberadamente (Conceptualmente, que está siendo desechado.), Como en código como: label, has_label, _ = text.partition(':').
  4. Como parte de una definición de función (usando defo lambda), cuando se fije la firma (por ejemplo, por una devolución de llamada o la API de la clase padre), pero esta implementación función particular no necesita todos los parámetros, como en el código como:callback = lambda _: True

(Durante mucho tiempo, esta respuesta solo enumeró los primeros tres casos de uso, pero el cuarto caso surgió con suficiente frecuencia, como se señala aquí , para que valga la pena enumerarlo explícitamente)

Los últimos casos de uso de "variable desechable o nombre de parámetro" pueden entrar en conflicto con el caso de uso de búsqueda de traducción, por lo que es necesario evitar usarlo _como variable desechable en cualquier bloque de código que también lo use para la traducción i18n (muchas personas prefieren un doble guión bajo) , __como su variable desechable exactamente por este motivo).


19
¿Podría explicar cómo funciona en una llamada de función, por ejemplo: elevar formularios.ValidationError (_ ("Ingrese un nombre de usuario correcto")) . He visto esto en el código de Django, y no está claro qué está pasando.
John C

41
Ese es el uso 2: por convención, _es el nombre utilizado para la función que realiza búsquedas de traducción de cadenas de internacionalización y localización. Estoy bastante seguro de que es la gettextbiblioteca C la que estableció esa convención.
ncoghlan

43
FWIW, personalmente comencé a usar __(un doble guión bajo) como mi variable de uso general para evitar conflictos con cualquiera de los dos primeros casos de uso.
ncoghlan

14
Las convenciones comunitarias emergentes no tienden a tener fuentes autorizadas, solo observaciones de las prácticas que han aparecido con el tiempo. FWIW, soy uno de los coautores de las actualizaciones más recientes de PEP 8, y mi respuesta se basa en las 3 formas diferentes que he visto _usar como nombre de variable desde que comencé a usar Python profesionalmente en 2002.
ncoghlan

12
La convención es principalmente para el desempaquetado de tuplas: a, __, c = iterablele dice al lector de inmediato que estamos desempacando una tupla de 3, pero solo usando los valores primero y último. Si en lugar de escribir a, b, c = iterable, el lector (o un código de linter automatizado) pueden esperar razonablemente que todos a, by cpara ser utilizado más adelante (y si no lo son, puede ser un signo de un fallo en algún lugar).
ncoghlan

207

Es solo un nombre de variable, y es convencional en Python para usar _con variables desechables. Simplemente indica que la variable de bucle no se usa realmente.


55
¿Quieres decir que no representa el último valor devuelto?
alwbtc 05 de

31
@steve solo en una concha de
Gabi Purcaru

44
similar al uso de _ en Prolog
Matthias

3
similar al uso de ~ en Matlab
PatriceG

Tenga en cuenta que en el shell cpython si define explícitamente _, deja de mantener permanentemente el valor de salida de la expresión anterior. Esto parece terriblemente inconsistente, y los estándares de Python Lang deben abordar esto. Deben definir _como un nombre desechable y evitar que se use como un identificador real.
theferrit32

78

El subrayado _se considera como variable " No me importa " o " Desechable " en Python

  • El intérprete de python almacena el último valor de expresión en la variable especial llamada _.

    >>> 10 
    10
    
    >>> _ 
    10
    
    >>> _ * 3 
    30
    
  • El guión bajo _también se usa para ignorar los valores específicos. Si no necesita los valores específicos o los valores no se utilizan, simplemente asigne los valores para subrayar.

    Ignorar un valor al desempacar

    x, _, y = (1, 2, 3)
    
    >>> x
    1
    
    >>> y 
    3
    

    Ignorar el índice

    for _ in range(10):     
        do_something()
    

2
Hay un tercer uso, que es para la función de internacionalización _("Hello world!").
Jeff Younker

3
A nivel del procesador, ¿existe realmente una diferencia entre "for _ in range" y "for x in range" y luego no usar x? ¿O es solo para la legibilidad humana?
iammax

1
@iammax Utilizando el dismódulo, descubrí que no había diferencia en el código de bytes . Sin embargo, los beneficios de la legibilidad humana son obvios.
Alistair Carscadden

21

Hay 5 casos para usar el guión bajo en Python.

  1. Para almacenar el valor de la última expresión en el intérprete.

  2. Para ignorar los valores específicos. (llamado "no me importa")

  3. Dar significados y funciones especiales al nombre de vartiables o funciones.

  4. Para usar como funciones de 'Internacionalización (i18n)' o 'Localización (l10n)'.

  5. Para separar los dígitos del valor literal del número.

Aquí hay un buen artículo con ejemplos de mingrammer .



3

En lo que respecta a los lenguajes Python, _no tiene un significado especial. Es un identificador válido como _foo, foo_o _f_o_o_.

Cualquier significado especial de _es puramente por convención. Varios casos son comunes:

  • Un nombre ficticio cuando una variable no está destinada a ser utilizada, pero la sintaxis / semántica requiere un nombre.

    # iteration disregarding content
    sum(1 for _ in some_iterable)
    # unpacking disregarding specific elements
    head, *_ = values
    # function disregarding its argument
    def callback(_): return True
    
  • Muchos REPL / shells almacenan el resultado de la última expresión de nivel superior en builtins._.

    El identificador especial _se usa en el intérprete interactivo para almacenar el resultado de la última evaluación; Se almacena en el builtinsmódulo. Cuando no está en modo interactivo, _no tiene un significado especial y no está definido. [ fuente ]

    Debido a la forma en que se buscan los nombres, a menos que estén sombreados por una _definición global o local a la que se _hace referencia builtins._.

    >>> 42
    42
    >>> f'the last answer is {_}'
    'the last answer is 42'
    >>> _
    'the last answer is 42'
    >>> _ = 4  # shadow ``builtins._`` with global ``_``
    >>> 23
    23
    >>> _
    4
    

    Nota: Algunos shells como ipythonno se asignan a builtins._casos especiales _.

  • En el contexto de internacionalización y localización, _se utiliza como un alias para la función de traducción primaria.

    gettext.gettext (mensaje)

    Devuelve la traducción localizada del mensaje, en función del dominio global actual, el idioma y el directorio local. Esta función generalmente tiene un alias como _ () en el espacio de nombres local (ver ejemplos a continuación).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.