La réponse précédemment acceptée a été deprecated au Python 3.0
. Au lieu d'utiliser inspect.getargspec
, vous devriez maintenant opter pour la classe Signature
qui l'a remplacée.
Création d'une signature pour la fonction est facile via le signature
function:
from inspect import signature
def someMethod(self, arg1, kwarg1=None):
pass
sig = signature(someMethod)
Maintenant, vous pouvez voir ses paramètres rapidement en str
ing il:
str(sig) # returns: '(self, arg1, kwarg1=None)'
ou vous pouvez également obtenir un mappage des noms d'attribut aux objets de paramètre via sig.parameters
.
params = sig.parameters
print(params['kwarg1']) # prints: kwarg1=20
De plus, vous pouvez appeler len
sur sig.parameters
pour voir aussi le nombre d'arguments de cette fonction nécessite:
print(len(params)) # 3
Chaque entrée dans le mappage params
est en fait un Parameter
object qui a d'autres attributs rendant votre vie Plus facile. Par exemple, saisir un paramètre et l'affichage de sa valeur par défaut est maintenant facile à réaliser avec:
kwarg1 = params['kwarg1']
kwarg1.default # returns: None
de même pour le reste des objets contenus dans parameters
.
Comme pour les utilisateurs Python 2.x
, tandis que inspect.getargspec
n'est pas dépréciée, la langue sera bientôt :-). La classe Signature
n'est pas disponible dans la série 2.x
et ne le sera pas. Donc, vous devez toujours travailler avec inspect.getargspec
.
En ce qui concerne la transition entre Python 2 et 3, si vous avez du code qui repose sur l'interface de getargspec
en Python 2 et le passage à signature
dans 3
est trop difficile, vous avez la possibilité d'utiliser de valeurinspect.getfullargspec
. Il offre une interface similaire à getargspec
(un seul argument appelable) afin de saisir les arguments d'une fonction lors de la manipulation aussi quelques cas supplémentaires getargspec
ne possède pas:
from inspect import getfullargspec
def someMethod(self, arg1, kwarg1=None):
pass
args = getfullargspec(someMethod)
Comme getargspec
, getfullargspec
renvoie une NamedTuple
qui contient les arguments.
print(args)
FullArgSpec(args=['self', 'arg1', 'kwarg1'], varargs=None, varkw=None, defaults=(None,), kwonlyargs=[], kwonlydefaults=None, annotations={})
Je suis en train de mettre en place un système de notification, qui ne sait pas vraiment à l'avance combien d'arguments le récepteur veut. (Normalement c'est tous ou aucun.) –
la question est entièrement justifiée; si ce n'était pas le cas (puisque vous pouvez toujours lire la source), il n'y aurait aucune justification pour le module de bibliothèque standard 'inspect'. – flow
De nombreuses langues implémentent au moins une fonctionnalité injustifiée. Le module 'inspect' a beaucoup d'autres fonctionnalités, il est donc injuste de dire que tout le module serait injustifié si une fonction particulière était. De plus, il est facile de voir comment cette fonctionnalité pourrait être mal utilisée. (Voir http://stackoverflow.com/questions/741950). Cela dit, c'est une fonctionnalité utile, en particulier pour l'écriture de décorateurs et d'autres fonctions qui fonctionnent sur la fonction. – user1612868