Frage Extrahieren des Werts aus einem Tupel, wenn die anderen Werte nicht verwendet werden


Ich habe ein Tupel foo was etwas enthält, was mir egal ist und was ich tue.

foo = (something_i_dont_need, something_i_need)

Ist es richtiger zu verwenden

_, x = foo

oder

x = foo[1]

Die einzigen Dinge, an die ich denken kann, sind unterschiedliche Verhaltensweisen foo ist nicht von der Länge zwei. Ich nehme an, dass das ziemlich fallspezifisch ist, aber ist das eine der de-facto-Pythic-Art, Dinge zu tun?


8
2018-02-25 20:02


Ursprung


Antworten:


Ich denke, die übliche Art, es zu tun

x=foo[index]

Verwenden _ ist weniger üblich, und ich denke auch, entmutigt. Verwenden _ ist auch unhandlich, wenn Sie nur ein paar Elemente aus einer langen benötigen tuple/list. Slicing ist auch praktisch, wenn Sie nur eine zusammenhängende Subsequenz auswählen.

Aber am Ende des Tages denke ich, es ist nur eine Frage der subjektiven Präferenz. Verwenden Sie alles, was für Sie und Ihr Team lesbarer aussieht.


7
2018-02-25 20:10



Ich habe benutzt _ seit über einem Jahrzehnt. Es ist viel besser lesbar, besonders wenn mehr als ein Wert extrahiert wird:

  _, _, name, _, _, city, _ = whatever

Selbst mit nur einer Variablen zwingt der andere Weg die Leser des Menschen dazu, zu zählen, wenn sie den Code wirklich verstehen wollen, und wahrscheinlicher werden ihre Augen nur darüber hinweggehen.

Mit den Unterstrichen können Sie die Mustervergleichsmöglichkeiten des menschlichen Gehirns etwas besser nutzen. Wahrscheinlich eine kleine Sache, aber jedes Bit hilft beim Debuggen. :)


10
2018-02-25 20:09



Beide sind akzeptabel, und ich habe beide im Produktionscode gesehen. Ich denke die Wahl des Kontexts, der Absicht und des lokalen Stils.

Es gibt auch eine dritte Option, bei der der Code den nicht verwendeten Wert beschreibt:

_real, imaginary = foo

Ich benutze alle drei innerhalb meines Codes, je nachdem, was am deutlichsten ist:

_, x = foo

  • Wenn das Tupel klein ist.
  • Wenn es wenige verworfene Werte gibt.
  • Wenn es wenige verworfene Werte relativ zur Anzahl der extrahierten Werte gibt.
  • Der Leser kennt wahrscheinlich die Zusammensetzung des Tupels, und die Zusammensetzung des ganzen Tupels ist wichtig.
  • Wenn es üblich ist, über die Struktur des Tupels als eine Einheit nachzudenken

x=foo[i]

  • Wenn das Tupel groß ist.
  • Wenn es viele verworfene Werte für einen Wert von vielen gibt.
  • Wenn der Leser wahrscheinlich die Zusammensetzung des Tupels kennt.
  • Der Rest der Werte des Tupels ist völlig und völlig irrelevant und bietet dem Leser keine nützliche Information.
  • Wenn es üblich ist, über die Struktur als Sequenz nachzudenken.
  • Wenn das Tupel eine einheitliche Zusammensetzung hat.
  • Wenn es üblich ist, einen Index für den Datentyp zu verwenden.
  • Wenn der Index in eine Schleife eingegeben wird.
  • Wenn der Leser auf den Indexwert aufmerksam gemacht werden soll.

_real, imaginary = foo

  • Wenn das Tupel klein ist.
  • Wenn es wenige verworfene Werte gibt.
  • Wenn der Leser die Zusammensetzung des Tupels wahrscheinlich nicht kennt.
  • Wenn der verworfene Wert benannt wird, erhält der Leser einen Einblick. (Sie können aus dieser einen Zeile erraten, dass foo ist eine komplexe Zahl.)

2
2018-02-25 20:49



Wenn dies ein Rückgabewert von einer Funktion oder Methode ist, besteht eine andere Alternative darin, eine Wrapper-Funktion zu schreiben (oder eine Klasse abzuleiten und eine Methode hinzuzufügen), die nur das Element zurückgibt, an dem Sie interessiert sind, und stattdessen dieses aufzurufen.


1
2018-02-25 23:23



1. Fall: foo benötigt zwei Variable zu unpack (Länge des Tupels ist 2). _ ist vollkommen in Ordnung.

2. Fall: Gibt dir index value  (Schneiden)


0
2018-02-25 20:21