562 Stimmen

Erweitern von Tupeln zu Argumenten

Gibt es eine Möglichkeit, ein Python-Tupel in eine Funktion zu erweitern - als aktuelle Parameter?

Zum Beispiel, hier expand() macht die Magie:

some_tuple = (1, "foo", "bar")

def myfun(number, str1, str2):
    return (number * 2, str1 + str2, str2 + str1)

myfun(expand(some_tuple)) # (2, "foobar", "barfoo")

Ich weiß, man könnte definieren myfun comme myfun((a, b, c)) aber natürlich kann es auch älteren Code geben. Danke

981voto

Alex Martelli Punkte 805329

myfun(*some_tuple) tut genau das, was Sie verlangen. Die * Operator entpackt einfach das Tupel (oder eine beliebige Iterable) und übergibt sie als Positionsargumente an die Funktion. Lesen Sie mehr über Entpacken von Argumenten .

78voto

Valentas Punkte 1734

Beachten Sie, dass Sie auch einen Teil der Argumentliste erweitern können:

myfun(1, *("foo", "bar"))

16voto

Uri Punkte 86472

Werfen Sie einen Blick auf das Python-Tutorial Abschnitt 4.7.3 und 4.7.4. Er spricht über die Übergabe von Tupeln als Argumente.

Ich würde auch erwägen, benannte Parameter zu verwenden (und ein Wörterbuch zu übergeben), anstatt ein Tupel zu verwenden und eine Sequenz zu übergeben. Ich halte die Verwendung von Positionsargumenten für eine schlechte Praxis, wenn die Positionen nicht intuitiv sind oder es mehrere Parameter gibt.

8voto

Dies ist die Methode der funktionalen Programmierung. Sie hebt die Funktion der Tupel-Erweiterung aus dem Syntaxzucker heraus:

apply_tuple = lambda f, t: f(*t)

Definieren Sie neu. apply_tuple über curry um eine Menge Geld zu sparen partial Anrufe auf lange Sicht:

from toolz import curry
apply_tuple = curry(apply_tuple)

Beispiel für die Verwendung:

from operator import add, eq
from toolz import thread_last

thread_last(
    [(1,2), (3,4)],
    (map, apply_tuple(add)),
    list,
    (eq, [3, 7])
)
# Prints 'True'

6voto

Mateen Ulhaq Punkte 21111

Ähnlich wie die Antwort von @Dominykas, ist dies ein Dekorator, der Multiargument-akzeptierende Funktionen in Tupel-akzeptierende Funktionen umwandelt:

apply_tuple = lambda f: lambda args: f(*args)

Beispiel 1:

def add(a, b):
    return a + b

three = apply_tuple(add)((1, 2))

Beispiel 2:

@apply_tuple
def add(a, b):
    return a + b

three = add((1, 2))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X