python überprüfe, ob die Funktion ** kwargs akzeptiert

8

gibt es eine Möglichkeit, zu überprüfen, ob eine Funktion ** kwargs annimmt, bevor sie sie aufruft, z. B.

%Vor%

Wenn ich diesen FuncA und FuncB ausführe, wäre das okay, aber FuncC Fehler mit got an unexpected keyword argument 'id' , da es keine Argumente akzeptiert

    
John 17.02.2011, 11:38
quelle

5 Antworten

12
katrielalex 17.02.2011, 11:40
quelle
7
%Vor%

Dies funktioniert nur für Python-Funktionen. Funktionen, die in C-Extensions (und Built-Ins) definiert sind, können knifflig sein und ihre Argumente manchmal auf ziemlich kreative Weise interpretieren. Es gibt keine Möglichkeit, zuverlässig zu erkennen, welche Argumente solche Funktionen erwarten. Siehe den Docstring der Funktion und andere von Menschen lesbare Dokumentation.

    
9000 17.02.2011 12:08
quelle
2

func ist die fragliche Funktion.

mit python2 ist es:

%Vor%

python3 ist ein bisschen Tricker, nach Ссылка muss der Parameter kind von% co_de sein %

  

Parameter.VAR_KEYWORD - ein Diktat von Schlüsselwortargumenten, die nicht an einen anderen Parameter gebunden sind. Dies entspricht einem "** kwargs" -Parameter in einer Python-Funktionsdefinition.

%Vor%     
spenthil 09.10.2015 03:51
quelle
1

Es scheint, dass Sie überprüfen möchten, ob die Funktion ein 'id' Schlüsselwort-Argument erhält. Sie können dies nicht wirklich durch Inspektion tun, da die Funktion möglicherweise keine normale Funktion ist, oder Sie könnten eine Situation wie diese haben:

%Vor%

f(id=3) schlägt immer noch fehl

Catching TypeError wie vorgeschlagen ist der beste Weg, um das zu tun, aber Sie können nicht wirklich herausfinden, was das TypeError verursacht hat. Zum Beispiel würde dies immer noch TypeError erhöhen:

%Vor%

Und das könnte ein Fehler sein, den Sie debuggen möchten. Und wenn Sie die Überprüfung durchführen, um einige Nebenwirkungen der Funktion zu vermeiden, sind sie möglicherweise noch vorhanden, wenn Sie sie fangen. Zum Beispiel:

%Vor%

Mein Vorschlag ist, zu versuchen, die Funktionen durch einen anderen Mechanismus zu identifizieren. Übergeben Sie beispielsweise Objekte mit Methoden anstelle von Funktionen und rufen Sie nur die Objekte mit einer bestimmten Methode auf. Oder fügen Sie dem Objekt oder der Funktion selbst ein Flag hinzu.

    
Rosh Oxymoron 17.02.2011 12:21
quelle
1

Nach Ссылка Sie sollten in der Lage sein, die Verwendung von **kwargs mit co_flags zu testen:

%Vor%

Wie in der Referenz erwähnt, kann sich dies jedoch in Zukunft ändern, daher würde ich auf jeden Fall empfehlen, besonders vorsichtig zu sein. Fügen Sie unbedingt einige Komponententests hinzu, um zu überprüfen, ob diese Funktion noch vorhanden ist.

    
julkiewicz 11.04.2015 17:15
quelle

Tags und Links