web-dev-qa-db-fra.com

Comment parcourir les arguments de fonction

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.

31
jackhab

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'
36
Johnsyweb
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)

17
SilentGhost

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

2
pygabriel

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.

1
extraneon