2011-07-08 6 views
2

J'ai une fonction:Comportement du paramètre buggy passant

def greeter(name, greeting, punc): 
    print greeting+', '+name+punc 

J'ai un dictionnaire avec les paramètres:

params={'name':'Mark','greeting':'How are you','punc':'?'} 

Quand j'appelle la fonction comme greeter(**params), je reçois le résultat attendu How are you, Mark?. Mais quand j'appelle comme ceci greeter(*params), j'obtiens la sortie name, puncgreeting. Il semble qu'une liste de clés de params a été transmise au greeter. Qu'est-ce qui se passe réellement ici?

Juste curieux.

Répondre

5

On dirait une liste de clés de params a été passé à Greeter. Qu'est-ce qui se passe réellement ici?

C'est en effet ce qui se passe, plus ou moins.

*x attend x pour être itérable, et itère sur elle, interprétant les résultats comme arguments un par un. Itérer sur une dict, par défaut, itère sur ses touches. (Vous pourriez obtenir des paires nom/valeur à la place, par exemple, avec greeter(*(params.items())), mais la dict ne serait pas triée, donc l'ordre de l'itération ne serait pas fiable.)

2

De même que l'itération sur une dict génère des clés, il en est de même de l'utiliser en expansion de position de cette manière.

print list(params)