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:
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
Informationen zur Übersetzung in i18n finden Sie im
gettext
zum Beispiel Dokumentation), wie im Code wie:
raise forms.ValidationError(_("Please enter a correct username"))
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(':').
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).
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.
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 _ .
>>>1010>>> _
10>>> _ *330
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.
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.
Zum Speichern des Werts des letzten Ausdrucks im Interpreter.
Zum Ignorieren der spezifischen Werte. (sogenanntes "Es ist mir egal")
Um dem Namen von Variablen oder Funktionen besondere Bedeutungen und Funktionen zu geben.
Verwendung als Funktionen 'Internationalisierung (i18n)' oder 'Lokalisierung (l10n)'.
Trennen der Ziffern des Zahlenliteralwerts.
Hier ist ein schöner Artikel mit Beispielen von Mingrammer .
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(1for _ in some_iterable)# unpacking disregarding specific elements
head,*_ = values
# function disregarding its argumentdef callback(_):returnTrue
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._.
>>>4242>>> f'the last answer is {_}''the last answer is 42'>>> _
'the last answer is 42'>>> _ =4# shadow ``builtins._`` with global ``_``>>>2323>>> _
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.
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).
len(tbh.bag.atom_set())
(wenn der zurückgegebene Wert eine__len__
Methode hat) odersum(1 for _ in tbh.bag.atom_set())
pylint
anderen Option für Dummy-Variablennamen steht ein Präfixdummy_
für den Variablennamen. Wenn Sie dieses Präfix mit verwendenpylint
, wirdpylint
keine Warnung ausgegeben. Sie können auch das Dummy-Variablenmuster konfigurieren, umpylint
Dinge wie zu berücksichtigen__
.Antworten:
_
hat 4 konventionelle Hauptanwendungen in Python:raise forms.ValidationError(_("Please enter a correct username"))
label, has_label, _ = text.partition(':')
.def
oderlambda
), 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).quelle
_
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-gettext
Bibliothek ist, die diese Konvention eingeführt hat.__
(einen doppelten Unterstrich) als Allzweck-Wegwerfvariable zu verwenden, um Konflikte mit einem der beiden ersten Anwendungsfälle zu vermeiden._
als Variablennamen verwendet habe, seit ich 2002 professionell mit Python angefangen habe.a, __, c = iterable
teilt dem Leser sofort mit, dass wir ein 3-Tupel auspacken, jedoch nur den ersten und den letzten Wert verwenden. Wenn wir stattdessen schreibena, b, c = iterable
, kann der Leser (oder eine automatisierte Code - Linter) erwarten ziemlich allea
,b
undc
später verwendet werden (und wenn sie es nicht sind , kann es ein Zeichen eines Fehlers irgendwo sein).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.quelle
_
, 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.Unterstrich
_
gilt als " Es ist mir egal " oder " Wegwerf " Variable in PythonDer Python-Interpreter speichert den letzten Ausdruckswert in der aufgerufenen speziellen Variablen
_
.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
Ignorieren Sie den Index
quelle
_("Hello world!")
.dis
Moduls stellte ich fest, dass es keinen Unterschied im Bytecode gab. Die Vorteile der menschlichen Lesbarkeit liegen jedoch auf der Hand.Es gibt 5 Fälle für die Verwendung des Unterstrichs in Python.
Zum Speichern des Werts des letzten Ausdrucks im Interpreter.
Zum Ignorieren der spezifischen Werte. (sogenanntes "Es ist mir egal")
Um dem Namen von Variablen oder Funktionen besondere Bedeutungen und Funktionen zu geben.
Verwendung als Funktionen 'Internationalisierung (i18n)' oder 'Lokalisierung (l10n)'.
Trennen der Ziffern des Zahlenliteralwerts.
Hier ist ein schöner Artikel mit Beispielen von Mingrammer .
quelle
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.
Viele REPLs / Shells speichern das Ergebnis des letzten Ausdrucks der obersten Ebene in
builtins._
.Aufgrund der Art und Weise, wie Namen nachgeschlagen werden, sofern nicht durch eine globale oder lokale
_
Definition beschattet, auf die sich das Bare_
beziehtbuiltins._
.Hinweis: Einige Shells, z. B.
ipython
nicht fürbuiltins._
Sonderfälle_
.Im Kontext wird Internationalisierung und Lokalisierung
_
als Alias für die primäre Übersetzungsfunktion verwendet.quelle