Ich habe ein Diktat, das ich Schlüssel / Werte als Schlüsselwortargumente übergeben muss. Zum Beispiel.
d_args = {'kw1': 'value1', 'kw2': 'value2'}
example(**d_args)
Dies funktioniert einwandfrei , aber wenn das d_args-Diktat Werte enthält, die von der example
Funktion nicht akzeptiert werden , stirbt es offensichtlich. Sagen wir , wenn die Beispielfunktion definiert ist alsdef example(kw2):
Dies ist ein Problem, da ich weder die Generierung der d_args
noch die example
Funktion steuere. Beide stammen von externen Modulen und example
akzeptieren nur einige der Schlüsselwortargumente aus dem Diktat.
Idealerweise würde ich es einfach tun
parsed_kwargs = feedparser.parse(the_url)
valid_kwargs = get_valid_kwargs(parsed_kwargs, valid_for = PyRSS2Gen.RSS2)
PyRSS2Gen.RSS2(**valid_kwargs)
Ich werde das Diktat wahrscheinlich nur aus einer Liste gültiger Schlüsselwortargumente herausfiltern, aber ich habe mich gefragt: Gibt es eine Möglichkeit, die Schlüsselwortargumente, die eine bestimmte Funktion verwendet, programmgesteuert aufzulisten?
inspect.getargspec(f)
ist seit Python 3.0 veraltet; Die moderne Methode istinspect.signature(f)
.co_varnames
Option funktioniert dagegen in beiden Fällen.Dadurch werden die Namen aller passablen Argumente, Schlüsselwörter und Nicht-Schlüsselwörter, gedruckt:
Dies liegt daran, dass zuerst
co_varnames
immer Parameter sind (als nächstes lokale Variablen, wiey
im obigen Beispiel).Jetzt könnten Sie also eine Funktion haben:
Was Sie dann so verwenden könnten:
BEARBEITEN : Ein kleiner Zusatz: Wenn Sie wirklich nur Schlüsselwortargumente einer Funktion benötigen , können Sie diese mithilfe des
func_defaults
Attributs extrahieren:Sie können Ihre Funktion jetzt mit bekannten Argumenten aufrufen, aber kwargs extrahieren, z.
Dies setzt voraus, dass
func
keine*args
oder**kwargs
Magie in seiner Signatur verwendet wird.quelle
In Python 3.0:
quelle
Für eine Python 3-Lösung können Sie
inspect.signature
nach den Parametern verwenden und filtern, die Sie kennen möchten.Nehmen einer Beispielfunktion mit Positions- oder Schlüsselwort-, Nur-Schlüsselwort-, Var-Positions- und Var-Schlüsselwortparametern:
Sie können ein Signaturobjekt dafür erstellen:
und filtern Sie dann mit einem Listenverständnis, um die Details herauszufinden, die Sie benötigen:
und in ähnlicher Weise für var positionals using
p.VAR_POSITIONAL
und var keyword withVAR_KEYWORD
.Darüber hinaus können Sie dem if eine Klausel hinzufügen, um zu überprüfen, ob ein Standardwert vorhanden ist, indem Sie prüfen, ob er
p.default
gleich istp.empty
.quelle
Erweiterung der Antwort von DzinX:
quelle