Python:如何动态调用具有各种签名的方法

2024-05-15 16:20:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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) 

确实有用。但问题是,用它们的名字调用的方法可以有不同数量的参数。然后我想pararmeter列表可以用元组表示,因为args的类型是tuple。所以我修改了最后一行代码-

^{pr2}$

但是翻译告诉我-

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)

我还试过list,和keywored args。他们两个都没用。请指教!在


Tags: 工具方法namesrcobjfoosysargs
2条回答

invoke(module, 'foo', (1, 2))扩展为foo((1, 2)),因此args是{}。它使用一个参数而不是两个参数调用foo,因此会出现错误。在

或者使用:

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

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

或者

^{pr2}$

为了“解包”一组值作为函数调用的参数,只需使用*,例如:

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

相关问题 更多 >