locals()
peut être votre ami ici si vous l'appelez la première chose dans votre fonction.
Exemple 1:
>>> def fun(a, b, c):
... d = locals()
... e = d
... print e
... print locals()
...
>>> fun(1, 2, 3)
{'a': 1, 'c': 3, 'b': 2}
{'a': 1, 'c': 3, 'b': 2, 'e': {...}, 'd': {...}}
Exemple 2:
>>> def nones(a, b, c, d):
... arguments = locals()
... print 'The following arguments are not None: ', ', '.join(k for k, v in arguments.items() if v is not None)
...
>>> nones("Something", None, 'N', False)
The following arguments are not None: a, c, d
réponse:
>>> def foo(a, b, c):
... return ''.join(v for v in locals().values() if v is not None)
...
>>> foo('Cleese', 'Palin', None)
'CleesePalin'
Mise à jour:
« Exemple 1 » met en évidence que nous avons un travail supplémentaire à faire si l'ordre de vos arguments est important que le dict
retourné par locals()
(ou vars()
) est non ordonnée. La fonction ci-dessus ne traite pas non plus les nombres avec beaucoup de grâce. Alors, voici quelques raffinements:
>>> def foo(a, b, c):
... arguments = locals()
... return ''.join(str(arguments[k]) for k in sorted(arguments.keys()) if arguments[k] is not None)
...
>>> foo(None, 'Antioch', 3)
'Antioch3'
FWIW, je pense que' * args' est le chemin à parcourir ici ... et si vous voulez concaténer seize cordes? Je voulais juste montrer que c'était possible en Python en utilisant la signature de la fonction fournie :-) – Johnsyweb
au lieu de locales, vous pouvez aussi utiliser vars(). – extraneon
@extraneon Merci pour le conseil. 'locals()' semble se comporter de la même manière que 'vars()' sans argument dans ce cas. – Johnsyweb