我正在用 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)
它确实有效。但问题是,通过名称调用的方法可以有不同数量的参数。然后我在想参数列表可以用一个元组表示,因为 args 的类型是一个元组。所以我改变了最后一行代码 -
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)
我还尝试了列表和关键字参数。他们都没有工作。请指教!