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
Quelques détails supplémentaires qui pourraient être utiles à savoir (questions que je me posais après la lecture de ceci et que j'ai testées):
- La fonction peut avoir des paramètres qui ne sont pas inclus dans le dictionnaire
- Vous ne pouvez pas remplacer un paramètre de fonction qui est déjà dans le dictionnaire
- Le dictionnaire ne peut pas avoir de valeurs qui ne sont pas dans la fonction.
Exemples:
Numéro 1: La fonction peut avoir des paramètres qui ne sont pas inclus dans le dictionnaire
In[5]: mydict = {'a': 100}
In[6]: myfunc(**mydict)
100 2
Numéro 2: Vous ne pouvez pas remplacer un paramètre de fonction qui est déjà dans le dictionnaire
In[7]: mydict = {'a': 100, 'b': 200}
In[8]: myfunc(a=3, **mydict)
TypeError: myfunc() got multiple values for keyword argument 'a'
Numéro 3: Le dictionnaire ne peut pas avoir de valeurs qui ne sont pas dans la fonction.
In[9]: mydict = {'a': 100, 'b': 200, 'c': 300}
In[10]: myfunc(**mydict)
TypeError: myfunc() got an unexpected keyword argument 'c'
Comment utiliser un dictionnaire avec plus de clés que d'arguments de fonction:
Une solution au point #3, ci-dessus, est d'accepter (et d'ignorer) des kwargs supplémentaires dans votre fonction (notez qu'en convention, _
est un nom de variable utilisé pour quelque chose qui est jeté, même si techniquement c'est juste un nom de variable valide pour Python):
In[11]: def myfunc2(a=None, **_):
In[12]: print(a)
In[13]: mydict = {'a': 100, 'b': 200, 'c': 300}
In[14]: myfunc2(**mydict)
100
Une autre option est de filtrer le dictionnaire en fonction des arguments de mot-clé disponibles dans la fonction:
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
Exemple avec des arguments positionnels et des arguments de mot-clé:
Remarquez également que vous pouvez utiliser des arguments positionnels et des listes ou des tuples de manière efficace de la même manière que les kwargs, voici un exemple plus avancé combinant à la fois des arguments positionnels et des arguments de mots-clés:
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}
0 votes
@JoonhoPark pourquoi ne pas écrire une question indépendante pour celle de votre commentaire?