482 Stimmen

Übergabe eines Wörterbuchs an eine Funktion als Schlüsselwortparameter

Ich möchte eine Funktion in Python mit Hilfe eines Wörterbuchs aufrufen.

Hier ist etwas Code:

d = dict(param='test')

def f(param):
    print(param)

f(d)

Dies druckt {'param': 'test'} aber ich möchte, dass es einfach gedruckt wird test .

Ich möchte, dass es für weitere Parameter ähnlich funktioniert:

d = dict(p1=1, p2=2)
def f2(p1, p2):
    print(p1, p2)
f2(d)

Ist dies möglich?

718voto

Dave Hillier Punkte 16611

Am Ende habe ich es selbst herausgefunden. Es ist einfach, mir fehlte nur der Operator **, um das Wörterbuch zu entpacken

So wird mein Beispiel:

d = dict(p1=1, p2=2)
def f2(p1,p2):
    print p1, p2
f2(**d)

216voto

David Parks Punkte 28103
In[1]: def myfunc(a=1, b=2):
In[2]:    print(a, b)

In[3]: mydict = {'a': 100, 'b': 200}

In[4]: myfunc(**mydict)
100 200

Ein paar zusätzliche Details, die hilfreich sein könnten (Fragen, die ich hatte, nachdem ich dies gelesen hatte, und die ich getestet habe):

  1. Die Funktion peut haben Parameter, die no im Wörterbuch enthalten
  2. Sie kann nicht einen Funktionsparameter überschreiben, der bereits im Wörterbuch enthalten ist
  3. Das Wörterbuch kann nicht Werte haben, die nicht in der Funktion enthalten sind.

Beispiele:

Nummer 1: Die Funktion kann Parameter haben, die nicht im Wörterbuch enthalten sind

In[5]: mydict = {'a': 100}
In[6]: myfunc(**mydict)
100 2

Nummer 2: Sie können einen Funktionsparameter, der bereits im Wörterbuch enthalten ist, nicht überschreiben

In[7]: mydict = {'a': 100, 'b': 200}
In[8]: myfunc(a=3, **mydict)

TypeError: myfunc() got multiple values for keyword argument 'a'

Nummer 3: Das Wörterbuch darf keine Werte enthalten, die nicht in der Funktion enthalten sind.

In[9]:  mydict = {'a': 100, 'b': 200, 'c': 300}
In[10]: myfunc(**mydict)

TypeError: myfunc() got an unexpected keyword argument 'c'

Wie man ein Wörterbuch mit mehr Schlüsseln als Funktionsargumenten verwendet:

Eine Lösung für #3, oben, ist es, zusätzliche kwargs in Ihrer Funktion zu akzeptieren (und zu ignorieren) (beachten Sie, nach Konvention _ ist ein Variablenname, der für etwas verwendet wird, das verworfen wird, obwohl es technisch gesehen nur ein gültiger Variablenname für Python ist):

In[11]: def myfunc2(a=None, **_):
In[12]:    print(a)

In[13]: mydict = {'a': 100, 'b': 200, 'c': 300}

In[14]: myfunc2(**mydict)
100

Eine weitere Möglichkeit besteht darin, das Wörterbuch auf der Grundlage der in der Funktion verfügbaren Schlüsselwortargumente zu filtern:

In[15]: import inspect
In[16]: mydict = {'a': 100, 'b': 200, 'c': 300}
In[17]: filtered_mydict = {k: v for k, v in mydict.items() if k in [p.name for p in inspect.signature(myfunc).parameters.values()]}
In[18]: myfunc(**filtered_mydict)
100 200

Beispiel mit Positions- und Schlüsselwortargumenten:

Beachten Sie ferner, dass Sie Positionsargumente und Listen oder Tupel praktisch auf die gleiche Weise wie kwargs verwenden können. Hier ist ein fortgeschritteneres Beispiel, das sowohl Positions- als auch Schlüsselwortargumente enthält:

In[19]: def myfunc3(a, *posargs, b=2, **kwargs):
In[20]:    print(a, b)
In[21]:    print(posargs)
In[22]:    print(kwargs)

In[23]: mylist = [10, 20, 30]
In[24]: mydict = {'b': 200, 'c': 300}

In[25]: myfunc3(*mylist, **mydict)
10 200
(20, 30)
{'c': 300}

36voto

llimllib Punkte 3501

In Python wird dies "Entpacken" genannt, und Sie können ein wenig darüber in der Lehrgang . Die Dokumentation ist beschissen, da stimme ich zu, vor allem, weil sie so phantastisch nützlich ist.

6voto

Patrick Harrington Punkte 45400

So geht's - funktioniert wie jede andere Iterable:

d = {'param' : 'test'}

def f(dictionary):
    for key in dictionary:
        print key

f(d)

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