Comment puis-je trouver le nombre d'arguments d'une fonction Python? J'ai besoin de savoir combien d'arguments normaux il a et combien d'arguments nommés.
Exemple:
def someMethod(self, arg1, kwarg1=None):
pass
Cette méthode a 2 arguments et 1 argument nommé.
inspect
module de bibliothèque standard.inspect
module a beaucoup d'autres fonctionnalités, il est donc injuste de dire que l'ensemble du module serait injustifié si une fonction particulière y figurait. De plus, il est facile de voir comment cette fonctionnalité pourrait être mal utilisée. (Voir stackoverflow.com/questions/741950 ). Cela dit, c'est une fonctionnalité utile, en particulier pour écrire des décorateurs et d'autres fonctions qui fonctionnent sur la fonction.Réponses:
La réponse précédemment acceptée a été dépréciée au
Python 3.0
. Au lieu d'utiliser,inspect.getargspec
vous devriez maintenant opter pour laSignature
classe qui l'a remplacé.Créer une signature pour la fonction est facile via la
signature
fonction :Désormais, vous pouvez soit afficher rapidement ses paramètres en l'
str
utilisant:ou vous pouvez également obtenir un mappage des noms d'attributs aux objets paramètres via
sig.parameters
.De plus, vous pouvez appeler
len
lesig.parameters
voir aussi le nombre d'arguments de cette fonction nécessite:Chaque entrée du
params
mappage est en fait unParameter
objet qui a d'autres attributs qui vous facilitent la vie. Par exemple, saisir un paramètre et afficher sa valeur par défaut est désormais facile avec:de même pour le reste des objets contenus dans
parameters
.Quant aux
2.x
utilisateurs de Python , bien queinspect.getargspec
non obsolète, le langage le sera bientôt :-). LaSignature
classe n'est pas disponible dans la2.x
série et ne le sera pas. Vous devez donc toujours travailler avecinspect.getargspec
.En ce qui concerne la transition entre Python 2 et 3, si vous avez du code qui repose sur l'interface de
getargspec
Python 2 et que le passage àsignature
dans3
est trop difficile, vous avez la possibilité d'utiliserinspect.getfullargspec
. Il offre une interface similaire àgetargspec
(un seul argument appelable) afin de récupérer les arguments d'une fonction tout en gérant des cas supplémentaires quigetargspec
ne le font pas:Comme avec
getargspec
,getfullargspec
renvoie aNamedTuple
qui contient les arguments.la source
co_argcount
getfullargspec
n'est pas implémenté dans Python 2.x, vous devez utilisergetargspec
getargspec
ne fonctionne pas sur les fonctions intégrées:getargspec(open)
donneTypeError: <built-in function open> is not a Python function
Voir cette réponse pour quelques idées ...print(args)
vous ne recevez pas quedefaults=(None,)
vous obtenezdefaults=None
.voir le module inspect
la source
inspect.signature
- docs.python.org/3/library/inspect.html#inspect.signatureou, si le nom de la fonction actuelle est indéterminé:
la source
dir(someMethod)
->'func_code'
; Allez plus loin:dir(someMethod.func_code)
->'co_argcount'
; Vous pouvez utiliser la fonction intégréedir()
pour déterminer les méthodes disponibles d'un objet.six.get_function_code(someMethod).co_argcount
some_method.__code__.co_argcount
co_argcount
est utilisé en interne lors de l'évaluation de l'objet code. Ce que j'essaie de dire, c'est qu'il n'y a vraiment aucune garantie que ces attributs ne changeront pas d'une version à l'autre.inspect.getargspec ()
Voir pouvez-vous-lister-les-arguments-mot-clé-qu'une-fonction-python-reçoit .
la source
Ajoutant à ce qui précède, j'ai également vu que la plupart du temps, la fonction help () aide vraiment
Par exemple, il donne tous les détails sur les arguments qu'il prend.
donne le ci-dessous
la source
help
La fonction ne montre que ce que dit la docstring. Avez-vous même testé si cela fonctionne avec la définition de fonction dans la question?help()
crache plus que la simple docstring - même sur du code non documenté, il imprime toujours l'argspec et vous indique où le code a été défini. La personne qui a posté la question initiale ne savait pas si elle avait besoin d'une réponse qui soit adaptée à la machine ou à l'homme. S'il a seulement besoin d'être humain,help()
c'est parfaitement adéquat.help()
retourne et essayer de trouver leargs
etkwargs
.Bonne nouvelle pour les personnes qui souhaitent le faire de manière portable entre Python 2 et Python 3.6+: utilisez la
inspect.getfullargspec()
méthode. Cela fonctionne à la fois dans Python 2.x et 3.6+Comme Jim Fasarakis Hilliard et d'autres l'ont souligné, c'était comme ceci:
1. En Python 2.x: utiliser
inspect.getargspec()
2. En Python 3.x: utiliser la signature, comme
getargspec()
etgetfullargspec()
étaient obsolètes.Cependant, à partir de Python 3.6 (à la demande générale?), Les choses ont changé pour mieux:
Depuis la page de documentation de Python 3 :
la source
inspect.getargspec () pour répondre à vos besoins
la source
Comme d'autres réponses le suggèrent,
getargspec
fonctionne bien tant que l'objet interrogé est en fait une fonction. Il ne fonctionne pas pour intégré des fonctions telles queopen
,len
, etc, et va lancer une exception dans ce cas:La fonction ci-dessous (inspirée par cette réponse ) montre une solution de contournement. Il renvoie le nombre d'arguments attendus par
f
:L'idée est d'analyser la spécification de fonction hors de la
__doc__
chaîne. Évidemment, cela dépend du format de ladite chaîne, donc ce n'est guère robuste!la source
func.__code__.co_argcount
vous donne plusieurs des arguments AVANT*args
func.__kwdefaults__
vous donne un dict des arguments de mot - clé APRÈS*args
func.__code__.co_kwonlyargcount
est égal àlen(func.__kwdefaults__)
func.__defaults__
vous donne les valeurs des arguments facultatifs qui apparaissent avant*args
Voici l'illustration simple:
la source
Dans:
En dehors:
Remarque: si xyz n'était pas dans la classe X et n'avait pas de "self" et juste "a, b, c", alors il aurait imprimé 3.
Pour python inférieur à 3.5, vous voudrez peut-être remplacer
inspect.getfullargspec
parinspect.getargspec
dans le code ci-dessus.la source