it-swarm.com.de

Welcher Stil für nicht verwendete Rückgabeparameter in einem Funktionsaufruf Python) verwendet werden soll

Gibt es einen empfohlenen/allgemein akzeptierten Codierungsstil für die Behandlung von Situationen, in denen eine Funktion ein Tupel von Werten zurückgibt, danach jedoch nur einer dieser Werte verwendet wird (beachten Sie, dass dies hauptsächlich für Bibliotheksfunktionen gedacht ist, die ich nicht ändern kann - Schreiben eines Wrappers Der Anruf ist wahrscheinlich ein bisschen übertrieben…)? Anstatt zu tun

a, b, c = foo()

und dann einfach nicht mit b und c, welche der folgenden Varianten sollte bevorzugt werden (oder gibt es eine andere?):

Variante 1 (Unterstrich)

a, _, _ = foo()

(was sehr klar und einfach ist, aber mit _ = gettext.gettext wird in vielen Anwendungen verwendet, die Übersetzungen verwenden)

Variante 2 (Dummy-Name)

a, unused, unused = foo()

(nicht sehr ansprechend, denke ich, dasselbe gilt für andere Namen wie dummy)

Variante 3 (Index)

a = foo()[0]

(zu mir das ()[0] sieht unpythonisch aus…)

31
user49643

Die Verwendung des Unterstrichs für nicht verwendete Variablen ist definitiv akzeptabel. Seien Sie jedoch gewarnt, in einigen Codebasen ist dies keine Option, da dieser Bezeichner als Abkürzung für gettext reserviert ist. Dies ist der häufigste Einwand gegen diesen Stil (obwohl er meines Erachtens für die Mehrheit kein Problem darstellt). Ich würde es immer noch empfehlen und immer selbst verwenden.

Namen wie dummy oder unused irritieren mich persönlich und ich sehe sie nicht besonders oft (in Python heißt das - ich kenne eine Delphi-Codebasis, die dummy verwendet großzügig, und es ist auch in Skripte durchgesickert, die mit dem fraglichen Programm verbunden sind). Ich würde dir davon abraten.

Es ist auch in Ordnung, nur einen Artikel aus dem zurückgegebenen Tupel zu extrahieren. Es erspart auch einige Probleme, die Anzahl der nicht verwendeten Werte richtig einzustellen. Beachten Sie jedoch, dass es zwei mögliche Nachteile hat:

  • Es explodiert nicht, wenn die Anzahl der Werte von den erwarteten Werten abweicht. Dies kann nützlich sein, um Verwechslungen und Tippfehler zu erkennen.
  • Es funktioniert nur, wenn der Rückgabewert eine Sequenz ist (das sind meistens Tupel und Listen, aber bleiben wir allgemein). Nebenbei kenne ich eine Klasse in meinem Code (einen 2D-Vektor), die iterierbar ist und eine konstante Anzahl von Werten liefert (und daher zum Entpacken von Aufgaben verwendet werden kann), aber nicht indizierbar ist.
17
user7043

Pylint hat mir angewöhnt, es so zu machen:

widget, _parent, _children = f()

Das heißt, nicht verwendete Ergebnisse haben einen beschreibenden Namen, dem _ vorangestellt ist. Pylint betrachtet Einheimische mit dem Präfix _ als nicht verwendet und Globale oder Attribute mit dem Präfix _ als privat.

22
Vincent Povirk

Wie andere gesagt haben, ist der Unterstrich (_) Der Standard. Wenn jedoch ein Unterstrich für Übersetzungen verwendet wird, ist ein doppelter Unterstrich meiner Meinung nach die beste Alternative.

var, __, value = "VAR=value".partition('=')

Besser als diese:

var, unused, value = "VAR=value".partition('=')

var, unused_del, value = "VAR=value".partition('=')

var, _del, value = "VAR=value".partition('=')

3
Rick Mohr

Wenn Sie dies in Ihrem gesamten Projekt nur einmal oder sehr selten für die jeweilige Funktion tun, würde ich Variante 1 verwenden, wenn Sie wissen, dass gettext in diesem Modul kein Problem darstellt, und ansonsten Variante 3.

Auf der anderen Seite, wenn Sie dies viel getan haben - und insbesondere, wenn Sie jedes Mal eine andere Teilmenge der Rückgabewerte möchten (Erstellen eines Wrappers zu Geben Sie einfach diejenigen zurück, die Ihnen am Herzen liegen. Es kann hilfreich sein, einen Wrapper zu schreiben, der die Ergebnisse in ein mit dem Namen Tuple oder eine Instanz einer anderen beschreibenden Klasse einfügt, mit der Sie Folgendes tun können:

bar = foo()

Und dann arbeite mit bar.a, bar.b und bar.c.

3
lvc

Ich bin kein Nicht-Python-Programmierer, aber für mich ist die dritte Variante am sinnvollsten.

In Variante 3 ist Ihnen absolut klar, mit welchen Werten Sie sich befassen möchten. In Variante 1 und 2 weisen Sie die Werte wieder Variablen zu und können somit verwendet werden. Sie haben sie vielleicht dunkel benannt, aber eine schlechte Benennung ist keine Lösung für ein Problem.

Warum sollten Sie, abgesehen von der Klarheit, einem Speicherplatz nicht verwendete Werte zuweisen (wie in den Varianten 1 und 2)? Dies wäre eine schlechte Lösung in Bezug auf die Speicherverwaltung.

1
Craige