J'ai une fonction Python fonction acceptant plusieurs arguments de chaîne def foo(a, b, c):
et de les concaténer dans une chaîne. Je veux parcourir tous les arguments de fonction pour vérifier qu'ils ne sont pas Aucun. Comment il peut Existe-t-il un moyen rapide de convertir Aucun en ""?
Merci.
locals()
peut être votre ami ici si vous l'appelez en premier 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 :
L'exemple 1 met en évidence que nous pourrions avoir du travail supplémentaire à faire si l'ordre de vos arguments est important car le dict
renvoyé par locals()
(ou vars()
) est non ordonné. La fonction ci-dessus ne traite pas non plus les nombres de manière très élégante. Voici donc quelques améliorations:
>>> 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'
def func(*args):
' '.join(i if i is not None else '' for i in args)
si vous rejoignez sur une chaîne vide, vous pouvez simplement faire ''.join(i for i in args if i is not None)
Vous pouvez utiliser le module inspect et définir une fonction comme celle-ci:
import inspect
def f(a,b,c):
argspec=inspect.getargvalues(inspect.currentframe())
return argspec
f(1,2,3)
ArgInfo(args=['a', 'b', 'c'], varargs=None, keywords=None, locals={'a': 1, 'c': 3, 'b': 2})
dans argspec, il y a toutes les informations dont vous avez besoin pour effectuer toute opération avec un argument passé.
Pour concaténer la chaîne, il suffit d'utiliser les informations d'argument reçues:
def f(a,b,c):
argspec=inspect.getargvalues(inspect.currentframe())
return ''.join(argspec.locals[arg] for arg in argspec.args)
Pour référence: http://docs.python.org/library/inspect.html#inspect.getargvalues
Est-ce peut-être ce que vous aimeriez?
def foo(a, b, c):
"SilentGhost suggested the join"
' '.join(i if i is not None else '' for i in vars().values())
def bar(a,b,c):
"A very usefull method!"
print vars()
print vars().values()
Notez l'utilisation de vars () , qui renvoie un dict.