如何调用带可变参数的方法f以适配f2、f3且不使用装饰器
适配不同参数方法的调用方案
嘿,这事儿其实很简单,咱们结合你给的代码直接看具体调用方式就行:
首先先明确下你的通用函数f的参数结构:
def f(method, timeout, condition=False, *args, **kwargs): # ... 函数逻辑
它的参数顺序是:要执行的目标方法method → 超时时间timeout → 可选的终止条件condition(默认值False)→ 传给目标方法的位置参数*args → 传给目标方法的关键字参数**kwargs
调用带两个位置参数的f2
你提到的示例调用f(f2,2,*(1,2))完全可行,这里相当于用了condition的默认值False,再把(1,2)作为f2的位置参数传递。如果需要指定condition为True,可以这么写:
# 明确传入condition,再传f2的参数 f(f2, 2, True, 1, 2) # 或者用*解包参数的方式 f(f2, 2, True, *(1, 2))
运行后,f会在超时时间内循环调用f2(1,2),直到超时或者满足condition条件时返回结果。
调用带一个位置参数的f3
调用f3只需要把它的参数放在condition(或默认值)后面即可:
# 用默认condition,直接传f3的参数 f(f3, 3, "测试消息") # 或者用*解包的方式 f(f3, 3, *("测试消息",)) # 如果需要指定condition为True f(f3, 3, True, "测试消息")
扩展:调用带关键字参数的方法
如果有需要关键字参数的方法,比如:
def f4(a, b, c=0): print(a, b, c)
调用时可以直接传递关键字参数给f:
f(f4, 2, False, 1, 2, c=5) # 或者单独用**解包关键字参数 f(f4, 2, True, *(1,2), **{"c":5})
核心原理
f函数里的*args和**kwargs会把你传入的额外参数原封不动地传递给目标方法method,所以不管目标方法需要多少个位置参数或关键字参数,只要按照f的参数顺序,把目标方法的参数放在condition之后,就能完美适配不同签名的方法,完全不需要用到装饰器。
内容的提问来源于stack exchange,提问作者BlueCompany
相关产品推荐
相关产品推荐

