2016-07-22 27 views
2

Ich habe versucht, die Signatur einer Funktion zu ändern mit dem inspect Modul:Wie setze ich die Signatur einer Funktion?

import inspect 

def some_func(a, b): 
    return 

sig = inspect.signature(some_func) 
new_params = list(sig.parameters.values()) + [inspect.Parameter('c', inspect._ParameterKind.POSITIONAL_OR_KEYWORD)] 
new_sig = sig.replace(parameters=new_params) 
some_func.__signature__ = new_sig 

Wenn ich die Funktion der Signatur überprüfen, zeigt die neue Signatur:

>>> inspect.signature(some_func) 
>>> <Signature (a, b, c)> 

Aber wenn ich versuche, um die Funktion aufzurufen nach der neuen Signatur, erhalte ich eine Typeerror:

>>> some_func(1, 2, 3) 
>>> TypeError: some_func() takes 2 positional arguments but 3 were given 

Wie kann ich die Unterschrift gesetzt, so dass der Interpr eter prüft die Argumente gegen die neue Signatur anstelle der ursprünglichen?

Antwort

0

Die Neuzuweisung von Funktionssignaturen wird von Python nicht unterstützt.

Die meisten Funktionen tun etwas mit ihren Argumenten. Wenn es Ihnen irgendwie gelungen ist, die Signatur einer Funktion zu ändern, verfügt der Funktionskörper nicht über die richtigen Argumente. Es ist nicht sinnvoll, etwas zu tun.

Wenn Sie absolut unerbittlich sind, dies trotzdem zu tun, müssten Sie etwas wie Unordnung mit der Funktion __code__ machen. Dies ist ein Low-Level-Implementierungsdetail, und es wird wahrscheinlich Python oder noch schlimmer zum Absturz bringen.

0

Ich denke, das ist ein Kategoriefehler. Sie können ein Objekt Signature erstellen, indem Sie eine vorhandene Funktion überprüfen, aber Sie können einer vorhandenen Funktion keine neue Signatur zuweisen, wie Sie es versuchen.

Das heißt, hasattr(some_func, '__signature__') gibt False zurück. Sie haben es in Ihrem Skript zugewiesen, aber Sie können Funktionen beliebige Funktionen zuweisen.

Um tatsächlich eine Funktion zu erstellen, die eine vorhandene Funktion ändert, müssen Sie sie umbrechen.

Verwandte Themen