2016-07-22 10 views
2

私はinspectモジュールを使用して、関数のシグネチャを変更してみました:私は、関数のシグネチャを検査する場合関数のシグネチャを設定する方法は?

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 

、それは新しい署名を示しています。

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

をしかし、私は関数を呼び出すしようとすると、新しいシグネチャによれば、TypeErrorが発生します。

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

どのようにシグネチャを設定して、interpr eterは元の署名ではなく新しい署名と引数を比較しますか?

答えて

0

機能シグネチャの再割り当ては、Pythonがサポートするものではありません。

ほとんどの関数do何かを引数にとります。何らかの形で関数の署名を変更することができた場合、関数本体には適切な引数がありません。それは意味をなさないことではありません。

とにかくこれを行うことに絶対に挑戦しているのであれば、関数の__code__で混乱を起こさなければならないでしょう。これは低レベルの実装の詳細なので、このように混乱させるとPythonがクラッシュするか、悪化する可能性があります。

0

これはカテゴリエラーだと思います。既存の関数を検査してSignatureオブジェクトを作成することはできますが、既存の関数に新しい署名を行うことはできません。

つまり、hasattr(some_func, '__signature__')Falseを返します。スクリプトでそれを割り当てたが、関数に任意の属性を割り当てることができます。

実際に既存の関数を変更する関数を作成するには、その関数をラップする必要があります。

関連する問題