0

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)

リストとキーワード化された引数も試しました。どちらも機能しませんでした。お知らせ下さい!

4

2 に答える 2

5

値のタプルを関数呼び出しの引数として「アンパック」するには、次のように使用します*

invoke(module, 'foo', *(1, 2))
于 2012-05-20T09:44:10.957 に答える
1

invoke(module, 'foo', (1, 2))に拡大しfoo((1, 2))ます。それは2つではなく1つの引数で呼び出されるため、エラーになります。args((1, 2),)foo

次のいずれかを使用します。

def invoke(obj, method_name, *args):
    method = getattr(obj, method_name)
    method(*args)

invoke(module, 'foo', 1, 2)

または

def invoke(obj, method_name, args):
    method = getattr(obj, method_name)
    method(*args)

invoke(module, 'foo', (1, 2))
于 2012-05-20T12:15:37.847 に答える