2016-09-20 5 views
-1

Ich habe die vorherigen Stack-Überlauf-Posts zu diesem Thema gesehen, aber ich kann immer noch nicht diese beiden Befehle verwenden, wenn ich versuche, meine Funktion auszuführen. Ich habe ein Demo-Beispiel für einen einfachen gleitenden Durchschnitt programmiert, den ich durch die Argumente, kwargs command, laufen lassen möchte.python * args und ** kwargs

import numpy as np 
def moving_average(data,lookback=7,SMA=True): #MA function 
    if SMA==True: 
     weights=np.repeat(1.0,lookback)/lookback 
     smas=np.convolve(data,weights,'valid') 
     return smas 

Die Ausführung dieser Funktion funktioniert wie erwartet.

data=np.random.randn(100) #randomly 
moving_average(data,lookback=7,SMA=True) #this outputs the correct set of numbers 

Allerdings die zweite Ich versuche, Args und Kwargs hinzuzufügen es zusammenbricht.

Was genau in der * Args ** Kwargs Logik bin ich falsch? Ich habe versucht, sowohl ein Tupel als auch ein Wörterbuch einzugeben, aber keiner von beiden scheint zu funktionieren.

+5

Das ist ... nicht was für Args und Kwargs ist. Wenn Sie die Argumentnamen kennen und diese einfach weitergeben möchten, warum möchten Sie dann args/kwargs verwenden? –

Antwort

1

Pass the *args und **kwargs auf Ihre Funktion nicht das Argument (en) und benannte Argument (e):

def test1(*args,**kwargs): 
    return moving_average(*args, **kwargs) 
1

In Ihrem Beispiel mit * args und ** kwargs:

def test1(*args,**kwargs): 
    return moving_average(data,lookback,SMA) 

data, lookback und SMA sind nicht mehr definiert. Es könnte sein:

def test1(*args, **kwargs): 
    return moving_average(args[0], kwargs['lookback'], kwargs['SMA']) 

oder

def test1(*args, **kwargs): 
    return moving_average(*args, **kwargs) 

Der Python Tutorial einen Abschnitt hat, die helfen könnten: Unpacking Argument Lists

1
def test1(*args,**kwargs): 

Ihre Funktion hat jetzt zwei lokale Variablen, args und kwargs. Einer enthält die Positionsargumente, die übergeben wurden (als Tupel), der andere die Schlüsselwortargumente (als ein Wörterbuch).

return moving_average(data,lookback,SMA) 

Hier verwenden Sie drei Variablennamen (Daten, Lookback und SMA), die in Ihrer Funktion nicht vorhanden ist, so dass Sie einen Fehler.

Sie könnten

getan
return moving_average(args[0], kwargs['lookback'], kwargs['SMA']) 

Aber dann wird Ihre test1 Funktion nur mit einer genauen Aufruf wie test1(data,lookback=7,SMA=True) arbeiten. Ein Anruf wie test1(data, 7, True) wird nicht funktionieren, da dann die Parameter alle in args sind, keine in).

Ihre Funktion könnte auch genau auf die Parameter übergeben, wie es sie erhalten:

return moving_average(*args, **kwargs) 

das funktioniert, aber es gibt keinen Nutzen für die test1 Funktion, es moving_average nur Anrufe und gibt seine Ergebnisse, warum nicht moving_average nennen direkt.

Verwandte Themen