Vous pouvez accepter des arguments nommés presque arbitraires pour une série de raisons - et c'est ce que le formulaire **kw
vous permet de faire. La raison la plus fréquente est de passer les arguments directement à une autre fonction que vous êtes en train d'encapsuler (les décorateurs sont un cas de ceci, mais FAR du seul!) - dans ce cas, **kw
desserre le couplage entre wrapper et wrappee, car le wrapper n'a pas besoin de connaître ou de se soucier de tous les arguments de la wrappee. Voici une autre, tout autre raison:
d = dict(a=1, b=2, c=3, d=4)
si tous les noms devaient être connus à l'avance, cette approche ne pouvait pas exister de toute évidence, non? Et d'ailleurs, le cas échéant, je préfère de beaucoup cette façon de faire un dict dont les clés sont des chaînes littérales à:
d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
simplement parce que ce dernier est tout à fait des signes de ponctuation lourds et donc moins lisible.
Lorsque aucune des excellentes raisons d'accepter **kwargs
s'applique, alors ne l'acceptez pas: c'est aussi simple que cela. IOW, s'il n'y a pas de bonne raison de permettre à l'appelant de passer des arguments supplémentaires avec des noms arbitraires, ne le permettez pas - évitez simplement de placer un formulaire **kw
à la fin de la signature de la fonction dans l'instruction def
.
Quant à en utilisant**kw
dans un appel, qui vous permet de mettre ensemble l'ensemble exact des arguments nommés que vous devez passer, chacun avec des valeurs correspondantes, dans un dict, indépendamment d'un seul point d'appel, puis utilisez que dict au point d'appel unique. Comparez:
if x: kw['x'] = x
if y: kw['y'] = y
f(**kw)
à:
if x:
if y:
f(x=x, y=y)
else:
f(x=x)
else:
if y:
f(y=y)
else:
f()
Même avec seulement deux possibilités (! Et la plus simple nature), le manque de **kw
fait aleady la deuxième option absolument intenable et intolérable - juste Imaginez comment il se joue quand il ya une demi-douzaine de possibilités, peut-être dans une interaction un peu plus riche ... sans **kw
, la vie serait un enfer absolu dans de telles circonstances!
Pensez varargs en C - vous pouvez parfois ne sais pas ce que vos arguments seront. –
S'il vous plaît ne pas utiliser l'expression "monde réel" - c'est argumentatif. Il dit "tous les exemples que j'ai vus jusqu'ici sont artificiels et inutiles, mon application est le monde réel, vos exemples sont un monde fantastique." S'il vous plaît changer votre question pour éliminer "monde réel". –
Seul quelqu'un qui aime argumenter penserait que ma question était argumentative. – meppum