J'ai un dict, dont j'ai besoin pour passer des clés / valeurs comme arguments de mot-clé. Par exemple ..
d_args = {'kw1': 'value1', 'kw2': 'value2'}
example(**d_args)
Cela fonctionne bien, mais s'il y a des valeurs dans le dict d_args qui ne sont pas acceptées par la example
fonction, il meurt évidemment. Disons, si la fonction d'exemple est définie commedef example(kw2):
C'est un problème car je ne contrôle ni la génération du d_args
, ni la example
fonction .. Ils viennent tous les deux de modules externes, et example
n'acceptent que certains des mots-clés-arguments du dict ..
Idéalement, je ferais juste
parsed_kwargs = feedparser.parse(the_url)
valid_kwargs = get_valid_kwargs(parsed_kwargs, valid_for = PyRSS2Gen.RSS2)
PyRSS2Gen.RSS2(**valid_kwargs)
Je vais probablement filtrer simplement le dict, à partir d'une liste d'arguments-mots-clés valides, mais je me demandais: y a-t-il un moyen de lister par programme les arguments de mots-clés qu'une fonction spécifique prend?
inspect.getargspec(f)
est obsolète depuis Python 3.0; la méthode moderne estinspect.signature(f)
.co_varnames
option, en revanche, fonctionne dans les deux.Cela affichera les noms de tous les arguments passables, mots-clés et non-mots-clés:
C'est parce que les premiers
co_varnames
sont toujours des paramètres (ensuite les variables locales, commey
dans l'exemple ci-dessus).Alors maintenant, vous pouvez avoir une fonction:
Que vous pourriez ensuite utiliser comme ceci:
EDIT : Un petit ajout: si vous n'avez vraiment besoin que des arguments de mots clés d'une fonction, vous pouvez utiliser l'
func_defaults
attribut pour les extraire:Vous pouvez maintenant appeler votre fonction avec des arguments connus, mais des kwargs extraits, par exemple:
Cela suppose qu'il
func
n'utilise aucun*args
ou de la**kwargs
magie dans sa signature.la source
Dans Python 3.0:
la source
Pour une solution Python 3, vous pouvez utiliser
inspect.signature
et filtrer en fonction du type de paramètres que vous souhaitez connaître.Prenant un exemple de fonction avec des paramètres de position ou de mot-clé, de mot-clé uniquement, var positional et var mot-clé:
Vous pouvez lui créer un objet de signature:
puis filtrez avec une liste de compréhension pour trouver les détails dont vous avez besoin:
et, de même, pour var positionals en utilisant
p.VAR_POSITIONAL
et var mot-clé avecVAR_KEYWORD
.De plus, vous pouvez ajouter une clause au if pour vérifier si une valeur par défaut existe en vérifiant si
p.default
égal àp.empty
.la source
Extension de la réponse de DzinX:
la source