Was ist der Zweck der einzelnen Unterstrichvariablen "_" in Python?


618

Was bedeutet _After forin diesem Code?

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


5
Für Ihren Fall wäre es entweder len(tbh.bag.atom_set())(wenn der zurückgegebene Wert eine __len__Methode hat) odersum(1 for _ in tbh.bag.atom_set())
Nick T

In einer pylintanderen Option für Dummy-Variablennamen steht ein Präfix dummy_für den Variablennamen. Wenn Sie dieses Präfix mit verwenden pylint, wird pylintkeine Warnung ausgegeben. Sie können auch das Dummy-Variablenmuster konfigurieren, um pylintDinge wie zu berücksichtigen __.
Trevor Boyd Smith

Antworten:


780

_ hat 4 konventionelle Hauptanwendungen in Python:

  1. Das Ergebnis des zuletzt ausgeführten Ausdrucks (/ Anweisung) in einer interaktiven Interpretersitzung speichern. Dieser Präzedenzfall wurde vom Standard-CPython-Interpreter festgelegt, und andere Interpreten sind diesem Beispiel gefolgt
  2. Informationen zur Übersetzung in i18n finden Sie im gettext zum Beispiel Dokumentation), wie im Code wie: raise forms.ValidationError(_("Please enter a correct username"))
  3. Als allgemeiner "Wegwerf" -Variablenname, um anzuzeigen, dass ein Teil eines Funktionsergebnisses absichtlich ignoriert wird (konzeptionell wird es verworfen.), Wie in Code wie : label, has_label, _ = text.partition(':').
  4. Als Teil einer Funktionsdefinition (entweder defoder lambda), bei der die Signatur festgelegt ist (z. B. durch einen Rückruf oder eine übergeordnete Klassen-API), benötigt diese spezielle Funktionsimplementierung jedoch nicht alle Parameter, wie im folgenden Code:callback = lambda _: True

(Diese Antwort listete lange Zeit nur die ersten drei Anwendungsfälle auf, aber der vierte Fall tauchte, wie hier erwähnt , häufig genug auf, um eine explizite Auflistung wert zu sein.)

Die letzteren Verwendungsfälle "Wegwerfvariable oder Parametername" können mit dem Anwendungsfall der Übersetzungssuche in Konflikt stehen. Daher muss vermieden werden, dass sie _in einem Codeblock, der sie auch für die i18n-Übersetzung verwendet, als Wegwerfvariable verwendet werden (viele Leute bevorzugen einen doppelten Unterstrich) , __wie ihr Wegwerf - Variable für genau aus diesem Grunde).


19
Könnten Sie erklären, wie es in einem Funktionsaufruf funktioniert, zum Beispiel: Erhöhen Sie forms.ValidationError (_ ("Bitte geben Sie einen korrekten Benutzernamen ein")) . Ich habe das im Django-Code gesehen und es ist nicht klar, was los ist.
John C

41
Dies ist Verwendung 2 - gemäß Konvention _ist dies der Name für die Funktion, die die Suche nach Internationalisierungs- und Lokalisierungszeichenfolgenübersetzungen durchführt. Ich bin mir ziemlich sicher, dass es die C- gettextBibliothek ist, die diese Konvention eingeführt hat.
Ncoghlan

43
FWIW, ich habe persönlich damit begonnen, __(einen doppelten Unterstrich) als Allzweck-Wegwerfvariable zu verwenden, um Konflikte mit einem der beiden ersten Anwendungsfälle zu vermeiden.
Ncoghlan

14
Aufstrebende Gemeinschaftskonventionen haben in der Regel keine maßgeblichen Quellen - nur Beobachtungen der Praktiken, die im Laufe der Zeit aufgetreten sind. FWIW, ich bin einer der Mitautoren neuerer PEP 8-Updates und meine Antwort basiert auf den drei verschiedenen Arten, wie ich sie _als Variablennamen verwendet habe, seit ich 2002 professionell mit Python angefangen habe.
ncoghlan

12
Die Konvention gilt hauptsächlich für das Auspacken von Tupeln: a, __, c = iterableteilt dem Leser sofort mit, dass wir ein 3-Tupel auspacken, jedoch nur den ersten und den letzten Wert verwenden. Wenn wir stattdessen schreiben a, b, c = iterable, kann der Leser (oder eine automatisierte Code - Linter) erwarten ziemlich alle a, bund cspäter verwendet werden (und wenn sie es nicht sind , kann es ein Zeichen eines Fehlers irgendwo sein).
Ncoghlan

207

Es ist nur ein Variablenname, und es ist in Python üblich, ihn _für Wegwerfvariablen zu verwenden . Es zeigt nur an, dass die Schleifenvariable nicht tatsächlich verwendet wird.


5
Sie meinen, es repräsentiert nicht den zuletzt zurückgegebenen Wert?
alwbtc

31
@ Steve nur in einer Python- Shell
Gabi Purcaru

4
ähnlich der Verwendung von _ in Prolog
Matthias

3
ähnlich der Verwendung von ~ in Matlab
PatriceG

Beachten Sie, dass in der cpython-Shell, wenn Sie explizit definieren _, der Ausgabewert des vorherigen Ausdrucks dauerhaft nicht mehr gespeichert wird . Dies scheint schrecklich inkonsistent zu sein, und die Python-Lang-Standards müssen dies berücksichtigen. Sie sollten lediglich _einen Wegwerfnamen definieren und verhindern, dass er als echte Kennung verwendet wird.
theferrit32

78

Unterstrich _gilt als " Es ist mir egal " oder " Wegwerf " Variable in Python

  • Der Python-Interpreter speichert den letzten Ausdruckswert in der aufgerufenen speziellen Variablen _ .

    >>> 10 
    10
    
    >>> _ 
    10
    
    >>> _ * 3 
    30
  • Der Unterstrich _wird auch zum Ignorieren der spezifischen Werte verwendet. Wenn Sie die spezifischen Werte nicht benötigen oder die Werte nicht verwendet werden, weisen Sie die Werte einfach dem Unterstrich zu.

    Ignorieren Sie beim Auspacken einen Wert

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

    Ignorieren Sie den Index

    for _ in range(10):     
        do_something()

2
Es gibt eine dritte Verwendung, die für die Internationalisierungsfunktion bestimmt ist _("Hello world!").
Jeff Younker

3
Gibt es auf Prozessorebene tatsächlich einen Unterschied zwischen "für _ im Bereich" und "für x im Bereich" und dann ohne Verwendung von x? Oder ist es nur für die menschliche Lesbarkeit?
Iammax

1
@iammax Bei Verwendung des disModuls stellte ich fest, dass es keinen Unterschied im Bytecode gab. Die Vorteile der menschlichen Lesbarkeit liegen jedoch auf der Hand.
Alistair Carscadden

21

Es gibt 5 Fälle für die Verwendung des Unterstrichs in Python.

  1. Zum Speichern des Werts des letzten Ausdrucks im Interpreter.

  2. Zum Ignorieren der spezifischen Werte. (sogenanntes "Es ist mir egal")

  3. Um dem Namen von Variablen oder Funktionen besondere Bedeutungen und Funktionen zu geben.

  4. Verwendung als Funktionen 'Internationalisierung (i18n)' oder 'Lokalisierung (l10n)'.

  5. Trennen der Ziffern des Zahlenliteralwerts.

Hier ist ein schöner Artikel mit Beispielen von Mingrammer .


2
Tatsächlich ist es ziemlich neu blog.pythonlibrary.org/2017/01/11/…
MichaelChirico

3

Was die Python-Sprachen betrifft, _hat dies keine besondere Bedeutung. Es ist ein gültiger Bezeichner genau wie _foo, foo_oder_f_o_o_ .

Jede besondere Bedeutung von _ist rein konventionell. Mehrere Fälle sind häufig:

  • Ein Dummy-Name, wenn eine Variable nicht verwendet werden soll, aber ein Name für die Syntax / Semantik erforderlich ist.

    # iteration disregarding content
    sum(1 for _ in some_iterable)
    # unpacking disregarding specific elements
    head, *_ = values
    # function disregarding its argument
    def callback(_): return True
  • Viele REPLs / Shells speichern das Ergebnis des letzten Ausdrucks der obersten Ebene in builtins._ .

    Die spezielle Kennung _wird im interaktiven Interpreter verwendet, um das Ergebnis der letzten Auswertung zu speichern. es wird im builtinsModul gespeichert . Wenn nicht im interaktiven Modus, _hat keine besondere Bedeutung und ist nicht definiert. [ Quelle ]

    Aufgrund der Art und Weise, wie Namen nachgeschlagen werden, sofern nicht durch eine globale oder lokale _Definition beschattet, auf die sich das Bare _bezieht 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

    Hinweis: Einige Shells, z. B. ipythonnicht für builtins._Sonderfälle _.

  • Im Kontext wird Internationalisierung und Lokalisierung _als Alias ​​für die primäre Übersetzungsfunktion verwendet.

    gettext.gettext (Nachricht)

    Gibt die lokalisierte Übersetzung der Nachricht basierend auf der aktuellen globalen Domäne, Sprache und dem Gebietsschema zurück. Diese Funktion wird normalerweise im lokalen Namespace als _ () bezeichnet (siehe Beispiele unten).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.