Qual é o objetivo da variável sublinhada “_” em Python?

618

Qual é o significado de _depois forneste código?

if tbh.bag:
   n = 0
   for _ in tbh.bag.atom_set():
      n += 1
alwbtc
fonte
5
Para o seu caso, seria mais limpo para tanto len(tbh.bag.atom_set())(se o valor retornado tem um __len__método) ousum(1 for _ in tbh.bag.atom_set())
Nick T
Em pylintoutra opção para nomes de variáveis ​​fictícios, existe um prefixo dummy_para o nome da variável. O uso desse prefixo com pylint, pylintnão emite um aviso. Também é possível configurar o padrão de variável dummy pylintpara acomodar coisas como __.
Trevor Boyd Smith

Respostas:

780

_ tem 4 principais usos convencionais em Python:

  1. Manter o resultado da última expressão executada (/ statement) em uma sessão interativa de intérprete. Esse precedente foi estabelecido pelo intérprete CPython padrão, e outros intérpretes seguiram o exemplo
  2. Para pesquisa de tradução no i18n (veja a documentação do gettext por exemplo), como no código como: raise forms.ValidationError(_("Please enter a correct username"))
  3. Como objetivo geral "descartável" nome da variável para indicar que parte do resultado função está sendo deliberadamente ignorado (Conceitualmente, ele está sendo descartado.), Como no código como: label, has_label, _ = text.partition(':').
  4. Como parte de uma definição de função (usando um defou lambda), onde a assinatura é fixa (por exemplo, por uma API de retorno de chamada ou de classe pai), mas essa implementação de função específica não precisa de todos os parâmetros, como em códigos como:callback = lambda _: True

(Por um longo tempo, essa resposta listou apenas os três primeiros casos de uso, mas o quarto caso surgiu com bastante frequência, como observado aqui , para valer a pena listar explicitamente)

Os últimos casos de uso "variável descartável ou nome do parâmetro" podem entrar em conflito com o caso de uso da pesquisa de tradução, portanto, é necessário evitar o uso _como variável descartável em qualquer bloco de código que também a use na tradução i18n (muitas pessoas preferem um sublinhado duplo , __como sua variável descartável exatamente por esse motivo).

ncoghlan
fonte
19
Você poderia explicar como funciona em uma chamada de função, por exemplo: raise forms.ValidationError (_ ("Digite um nome de usuário correto")) . Eu já vi isso no código do Django, e não está claro o que está acontecendo.
John C
41
Esse é o uso 2 - por convenção, _é o nome usado para a função que realiza pesquisas de tradução de cadeia de internacionalização e localização. Tenho certeza de que foi a gettextbiblioteca C que estabeleceu essa convenção.
Ncoghlan
43
FWIW, eu pessoalmente comecei a usar __(um sublinhado duplo) como minha variável descartável de uso geral para evitar conflitos com um dos dois primeiros casos de uso.
Ncoghlan
14
Convenções comunitárias emergentes não tendem a ter fontes autorizadas - apenas observações das práticas que surgiram ao longo do tempo. FWIW, sou um dos co-autores de atualizações mais recentes do PEP 8, e minha resposta se baseia nas três maneiras diferentes que eu vi _usadas como um nome de variável desde que comecei a usar o Python profissionalmente em 2002.
ncoghlan
12
A convenção é principalmente para descompactar as tuplas: a, __, c = iterableinforma imediatamente ao leitor que estamos descompactando uma tripla, mas apenas usando o primeiro e o último valores. Se, em vez escrever a, b, c = iterable, o leitor (ou um linter código automatizado) pode razoavelmente esperar todos a, be cpara ser usado mais tarde (e se eles não estão, pode ser um sinal de um algum lugar bug).
Ncoghlan
207

É apenas um nome de variável e é convencional em python usar _para variáveis ​​descartáveis. Apenas indica que a variável de loop não é realmente usada.

gsteff
fonte
5
quer dizer que não representa o último valor retornado?
Alwbtc 5/05
31
@ Steve somente em um python shell
Gabi Purcaru
4
semelhante ao uso de _ em Prolog
Matthias
3
semelhante ao uso de ~ em Matlab
PatriceG
Observe que, no shell cpython, se você definir explicitamente _, ele para de manter permanentemente o valor de saída da expressão anterior. Isso parece terrivelmente inconsistente, e os padrões do Python lang precisam resolver isso. Eles devem apenas definir _como um nome descartável e impedir que seja usado como um identificador real.
theferrit32
78

Sublinhado _é considerado como variável " Eu não me importo " ou " Throwaway " em Python

  • O interpretador python armazena o último valor da expressão na variável especial chamada _.

    >>> 10 
    10
    
    >>> _ 
    10
    
    >>> _ * 3 
    30
  • O sublinhado _também é usado para ignorar os valores específicos. Se você não precisar dos valores específicos ou os valores não forem usados, apenas atribua os valores a sublinhado.

    Ignorar um valor ao desembalar

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

    Ignore o índice

    for _ in range(10):     
        do_something()
Ashish Sahu
fonte
2
Há um terceiro uso, que é para a função de internacionalização _("Hello world!").
Jeff Younker
3
No nível do processador, existe realmente uma diferença entre "para _ no intervalo" e "para x no intervalo" e depois não usar x? Ou é apenas pela legibilidade humana?
Iammax 11/07
1
@iammax Usando o dismódulo, descobri que não havia diferença no bytecode. Os benefícios da legibilidade humana são óbvios, no entanto.
Alistair Carscadden
21

Existem 5 casos para usar o sublinhado no Python.

  1. Para armazenar o valor da última expressão no intérprete.

  2. Por ignorar os valores específicos. (chamado "eu não ligo")

  3. Atribuir significados e funções especiais ao nome de variáveis ​​ou funções.

  4. Para usar como funções 'Internacionalização (i18n)' ou 'Localização (l10n)'.

  5. Para separar os dígitos do valor literal do número.

Aqui está um bom artigo com exemplos de mingrammer .

Reck
fonte
2
Na verdade, é bastante novo blog.pythonlibrary.org/2017/01/11/…
MichaelChirico
3

No que diz respeito às linguagens Python, _não tem significado especial. É um identificador válido como _foo, foo_ou_f_o_o_ .

Qualquer significado especial _é puramente por convenção. Vários casos são comuns:

  • Um nome fictício quando uma variável não se destina a ser usada, mas um nome é requerido pela sintaxe / semântica.

    # iteration disregarding content
    sum(1 for _ in some_iterable)
    # unpacking disregarding specific elements
    head, *_ = values
    # function disregarding its argument
    def callback(_): return True
  • Muitos REPLs / shells armazenam o resultado da última expressão de nível superior em builtins._.

    O identificador especial _é usado no intérprete interativo para armazenar o resultado da última avaliação; é armazenado no builtinsmódulo. Quando não está no modo interativo, _não tem significado especial e não está definido. [ fonte ]

    Devido à maneira como os nomes são pesquisados, a menos que ocultos por uma _definição global ou local a que o bare _se refere 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: Alguns shells, como os ipythonque não são atribuídos, são usados ​​em casos builtins._especiais _.

  • No contexto internacionalização e localização, _é usado como um alias para a função de tradução primária.

    gettext.gettext (mensagem)

    Retorne a tradução localizada da mensagem, com base no domínio global atual, idioma e diretório de localidade. Essa função geralmente é aliasizada como _ () no espaço para nome local (veja exemplos abaixo).

MisterMiyagi
fonte