2012-03-29 3 views
2

Javascript ein schlecht konstruiert, aber praktisch „Argumente“ Variable in jeder Funktion, so dass Sie Argumente durch eine Funktion wie so passieren kann:Does Python eine Möglichkeit haben, Argumente über eine Funktion zu übergeben

function foo(a, b, c) { 
    return bar.apply(this, arguments); 
} 
function bar(a, b, c) { 
    return [a, b, c]; 
} 
foo(2, 3, 5); // returns [2, 3, 5] 

Gibt es eine einfache Möglichkeit, eine ähnliche Sache in Python zu tun?

Antwort

1

Ja, das ist, was ich hätte sagen sollen.

def foo(*args): 
    return bar(*args) 

Sie müssen die Funktion nicht mit (a, b, c) deklarieren. bar (...) bekommt was auch immer foo (...) bekommt.

Meine anderen mieseren Antwort ist unten:


ich zur Beantwortung so nah war „Nein, kann es nicht leicht getan werden“, aber mit ein paar zusätzlichen Linien, ich glaube, es kann. @cbrauchli große Idee mit Einheimischen(), aber da Einheimische() auch lokale Variablen zurückgibt, wenn wir

def foo(a,b,c): 
    n = "foobar" # any code that declares local variables will affect locals() 
    return bar(**locals()) 

tun wir ein unerwünschtes 4. Argument werden vorbei, n, bar (a, b, c) und wir werden einen Fehler bekommen. Um dies zu lösen, würden Sie so etwas wie Argumente = Einheimischen() in der ersten Zeile das heißt

def foo(a, b, c): 
    myargs = locals() # at this point, locals only has a,b,c 
    total = a + b + C# we can do what we like until the end 
    return bar(**myargs) # turn the dictionary of a,b,c into a keyword list using ** 
+0

Wie wurde diese Antwort akzeptiert, wenn @ Andrews einfacher ist, mehr Pythonic und direkt auf den Punkt? – ereOn

+0

Ich bin wirklich ziemlich erstaunt. – pagga

4
>>> def foo(*args): 
...  return args 

>>> foo(1,2,3) 
(1,2,3) 

ist das was du willst?

+0

Python '* args' Funktionalität verhält sich die Art und Weise tun wollen, dass' spread' und 'rest' sind für die zu erwartende nächste Javascript-Standardisierung. –

+2

auch für Keyword-Ausdrücke des Stils 'foo (a = 1, b = 2)' können Sie sie mit der '**' Keyword-Erweiterung erfassen: 'foo (** kwargs)', die Ihnen kwargs als 'dict' gibt und jedes Diktat kann als Schlüsselwortargumente über 'bar (** kwargs)' –

+0

an eine andere Funktion gesendet werden. Sie können auch + matchen: 'foo (a, b, * args)' oder 'foo (a, b = None, ** kargs) 'oder sogar, in python 3,' foo (a, b, * args, c = Keine, ** kargs) ' –

2

Wie wäre es mit * für Argument Erweiterung?

>>> def foo(*args): 
...  return bar(*(args[:3])) 
>>> def bar(a, b, c): 
...  return [a, b, c] 
>>> foo(1, 2, 3, 4) 
[1, 2, 3] 
+0

Das ist fast, was ich will, aber ich würde * args in der Definition verwenden müssen -Ich kann nicht: 'def foo (a, b, c): return bar (* (args [: 3]))' – futuraprime

+0

Die einzige Sache, die ich denken kann, ist mit 'localhosts()' in foo. 'locals(). values ​​()' würde dir alle Argumente geben, die an foo übergeben werden, aber sie würden nicht in einer konsistenten Reihenfolge sein. –

+0

@futuraprime Eigentlich kratzen das. Sie würden in einer konsistenten Reihenfolge basierend auf den Namen der Argumente sein (das heißt, solange Ihre Argumente mit a, b und c benannt wurden, würden ihre Werte in derselben Reihenfolge ausgegeben). Im Fall von "a, b, c" erhalten Sie die Werte in der Reihenfolge "a, c, b". Es scheint nicht so, als wäre es die Mühe wert. –

1

Ich denke, das am ehesten Ihren Javascript-Schnipsel ähnelt. Sie müssen die Funktionsdefinition nicht ändern.

>>> def foo(a, b, c): 
... return bar(**locals()) 
... 
>>> def bar(a, b, c): 
... return [a, b, c] 
... 
>>> foo(2,3,5) 
[2, 3, 5] 

Beachten Sie, dass locals() bekommt alle der lokalen Variablen, so dass Sie es zu Beginn des Verfahrens verwendet werden soll und eine Kopie des Wörterbuchs machen es erzeugt, wenn Sie andere Variablen zu deklarieren. Oder Sie können das Modul inspect wie in this SO post erläutert verwenden.

Verwandte Themen