2014-04-22 5 views
1

Pour garder quelques modules, je construis en Python un peu cohérent Je veux faire du contrôle de code automatisé. Pour cela, je veux vérifier les modules pour leurs fonctions et les arguments que les fonctions prennent. Je peux utiliser hasattr() pour vérifier si le module contient effectivement les fonctions attendues. Jusqu'ici tout va bien.Comment vérifier les arguments d'une fonction/méthode?

Je veux maintenant voir quels arguments les fonctions prennent. Il suffirait de voir simplement les noms des variables. Je ne sais pas comment je serais capable de faire cela. Est-ce que quelqu'un sait comment je peux obtenir les noms des arguments qu'une fonction prend?

+1

Regardez ['inspect.getargspec'] (https://docs.python.org/2/library/inspect.html#inspect.getargspec) et d'autres fonctions dans ce module. – BrenBarn

+1

Je comprends qu'il y a une copie de ceci, mais je ne l'ai tout simplement pas trouvée parce que je ne savais pas ce qu'est une signature. Je peux imaginer qu'il y a plus de gens avec le même déficit, alors je proposerais de laisser cette question ouverte aux futurs lecteurs. – kramer65

+0

@ kramer65: les questions en double ne sont pas supprimées pour les raisons que vous avez mentionnées, essentiellement les questions en double sont conservées pour devenir des appâts de liens pour le moteur de recherche pour les personnes qui utilisent différents mots clés de recherche que la réponse canonique. –

Répondre

4

Vous pouvez utiliser inspect.getargspec() pour voir quels arguments sont acceptés et toutes les valeurs par défaut pour les arguments de mot-clé.

Démo:

>>> def foo(bar, baz, spam='eggs', **kw): pass 
... 
>>> import inspect 
>>> inspect.getargspec(foo) 
ArgSpec(args=['bar', 'baz', 'spam'], varargs=None, keywords='kw', defaults=('eggs',)) 
>>> inspect.getargspec(foo).args 
['bar', 'baz', 'spam'] 

En Python 3, vous voulez utiliser inspect.getfullargspec() comme cette méthode prend en charge les nouvelles fonctionnalités de l'argument de la fonction Python 3:

>>> def foo(bar: str, baz: list, spam: str = 'eggs', *, monty: str = 'python', **kw) -> None: pass 
... 
>>> import inspect 
>>> inspect.getfullargspec(foo) 
FullArgSpec(args=['bar', 'baz', 'spam'], varargs=None, varkw='kw', defaults=('eggs',), kwonlyargs=['monty'], kwonlydefaults={'monty': 'python'}, annotations={'baz': <class 'list'>, 'return': None, 'spam': <class 'str'>, 'monty': <class 'str'>, 'bar': <class 'str'>}) 

inspect.getargspec() devrait être considéré comme dépréciée en Python 3.

Python 3.4 ajoute le inspect.Signature() object:

>>> inspect.signature(foo) 
<inspect.Signature object at 0x100bda588> 
>>> str(inspect.signature(foo)) 
"(bar:str, baz:list, spam:str='eggs', *, monty:str='python', **kw) -> None" 
>>> inspect.signature(foo).parameters 
mappingproxy(OrderedDict([('bar', <Parameter at 0x100bd67c8 'bar'>), ('baz', <Parameter at 0x100bd6ea8 'baz'>), ('spam', <Parameter at 0x100bd69f8 'spam'>), ('monty', <Parameter at 0x100bd6c28 'monty'>), ('kw', <Parameter at 0x100bd6548 'kw'>)])) 

et beaucoup d'autres options intéressantes pour jouer avec des signatures.

+2

Vous pouvez mentionner que cette fonction est [obsolète] (https://docs.python.org/3/library/inspect.html#inspect.getargspec) dans Python 3.x en faveur de ['inspect.getfullargspec' ] (https://docs.python.org/3/library/inspect.html#inspect.getfullargspec). – iCodez

Questions connexes