Alors que la plupart des réponses sont en train de dire que, par exemple,
def f(**kwargs):
foo = kwargs.pop('foo')
bar = kwargs.pop('bar')
...etc...
est "le même"
def f(foo=None, bar=None, **kwargs):
...etc...
ce n'est pas vrai. Dans ce dernier cas, f
peut être appelé comme f(23, 42)
, alors que dans le premier cas, accepte les arguments nommés uniquement - pas de position des appels. Souvent, vous voulez permettre à l'appelant un maximum de flexibilité et, par conséquent, la deuxième forme, comme la plupart des réponses affirmer, il est préférable: mais ce n'est pas toujours le cas. Lorsque vous acceptez de nombreux paramètres facultatifs de qui, en général, seuls quelques-uns sont passés, il peut être une excellente idée (en évitant les accidents et illisible code à vos sites d'appel!) pour forcer l'utilisation d'arguments nommés -- threading.Thread
est un exemple. La première forme est la façon dont vous la mettre en Python 2.
L'idiome est tellement important que, dans Python 3, il a maintenant le soutien de la syntaxe: chaque argument après un seul *
dans la def
signature est le mot-clé seule, qui est, ne peut pas être passé en position d'argument, mais seulement comme un nom. Donc en Python 3, vous pourriez le code ci-dessus:
def f(*, foo=None, bar=None, **kwargs):
...etc...
En effet, en Python 3, vous pouvez même avoir des mots clés uniquement arguments qui ne sont pas en option (sans valeur par défaut).
Cependant, Python 2 a encore de longues années de vie productive, il est donc préférable de ne pas oublier les techniques et les expressions idiomatiques qui permettent d'implémenter en Python 2 élément important de la conception des idées qui sont directement pris en charge dans le langage Python 3!