Python でテスト自動化ツールを作成しています。このツールの重要な機能は、C# リフレクションが行うのと同じように、さまざまなシグネチャを持つ名前でメソッドを呼び出すことです。しかし、一連の記事を読み、いくつかのテストを行った後、さまざまな署名を処理する方法を見つけることができませんでした。
これが私の最初の考えです -
def invoke(obj, method_name, *args):
print type(args)
method = getattr(obj, method_name)
method(*args)
import sys
module = sys.modules[__name__]
invoke(module, 'foo', 1, 2)
それは機能します。しかし問題は、その名前で呼び出されるメソッドが異なる数のパラメーターを持つことができることです。次に、引数の型がタプルであるため、パラメータリストをタプルで表現できると考えていました。だから私はコードの最後の行を変更します -
invoke(module, 'foo', (1, 2)) # pass parameter list using a tuple (1, 2)
しかし、通訳は私にこう言いました -
Traceback (most recent call last):
File "\Src\studies\dynamic_method_call.py", line 14, in <module>
invoke(module, 'foo', (1, 2))
File "\Src\studies\dynamic_method_call.py", line 9, in invoke
print method(*args)
TypeError: foo() takes exactly 2 arguments (1 given)
リストとキーワード化された引数も試しました。どちらも機能しませんでした。お知らせ下さい!