2017-10-11 4 views
0

Ich schreibe einen Code, in dem einige Funktionen viele Eingabevariablen benötigen. Also, ich dachte, es wäre eine gute Idee, diese Eingabevariablen über ein Wörterbuch aufrufbar zu machen. Ich habe Probleme mit Funktionen, die von Elternfunktionen aufgerufen werden. Betrachten Sie als ein einfaches Beispiel den folgenden Code.Wie können Wörterbuchelemente als Funktionskwarts in Eltern- und Kind-/Unterfunktionen verwendet werden?

import numpy as np 

## generate some data and call function via dict 

def f(x): 
    return np.cos(x) 

data_one = np.linspace(1, 10, 10) # x 
data_two = f(data_one) # y 

xy_dict = dict(x=data_one, y=data_two) ## put x,y into dict 

def try_dict_ops(x, y): 
    c = [x[i] - y[i] for i in range(len(x)) if len(x) == len(y)] 
    return np.array(c) 

print(try_dict_ops(**xy_dict)) 
## prints array, it works 

Jetzt werde ich eine Elternfunktion und entsprechende Daten dict vorstellen.

Meine Frage bezieht sich auf die verschiedenen Methoden zum Aufruf der Elternfunktion, die wiederum die oben definierte Unterfunktion aufruft. Gibt es einen einfacheren Weg, dies zu tun, ohne x und y in abxy_dict explizit zu setzen? Was ist, wenn eine Elternfunktion zwei verschiedene Unterfunktionen aufruft, von denen beide Kwargs-Namen teilen, aber nicht unbedingt Arg-Werte - ist mein Ziel bei solch einem Setup noch möglich?

Antwort

2

Verwenden eines Wörterbuchs zum Übergeben von Schlüsselwortargumenten ist nur eine andere Schreibweise beim Aufrufen einer Funktion. Es spielt keine Rolle zu der Funktion selbst wie es hieß, es wird diese Argumente auf die eine oder andere Weise erhalten.

Mit anderen Worten, die Funktion schert sich nicht wenn Sie

verwendet
xy_dict = dict(x=data_one, y=data_two) 
try_dict_ops(**xy_dict) 

oder

try_dict_ops(x=data_one, y=data_two) 

oder

try_dict_ops(data_one, data_two) 

Wenn Ihre Funktion nicht wirklich braucht Zugang zu x und y (s o der einzige Zweck sie in der Weitergabe ist sie an den transitiven Funktion Anrufe weitergeben), dann fängt gerade diese Argumente in einem **kwargs catch-all:

def try_nested_dict_ops(a, b, **kwargs): 
    g = [try_dict_ops(**kwargs)[i] * a + b for i in range(len(x))] 
    return np.array(g) 

Jetzt alles extra Stichwort Argumente try_nested_dict_ops() geben werden übergeben auf den try_dict_ops() Aufruf, ohne die Funktion selbst zu wissen, was diese Argumente sind. Sie können dies für mehrere Funktionsaufrufe verwenden.

Dann müssen x und y als Schlüsselwortargumente übergeben werden, nicht als Positionsargumente.

+0

Extrem nützlich, danke! Kurz gesagt, kann eine Funktion abrufbare Kwargs aus mehreren Wörterbüchern haben? – mikey

+0

@mikey wieder, verwechseln Sie nicht die ähnliche Syntax für den Aufruf und für die Definition von Funktionsparametern. Ab Python 3.5 können Sie mehrere Wörterbücher mit '** name' in einem Anruf angeben. Alle kombinierten Schlüsselwerte werden an die Funktion übergeben. Es liegt an der Funktion, wenn sie Parameter und/oder einen Catch-All-Parameter explizit benannt hat. –

Verwandte Themen