我正在尝试利用队列模块的wait_for
方法。我有一个谓词可调用对象,如果我不传递任何参数,它就可以工作,但是可调用对象需要一个int
参数。
作品:
self.cv.wait_for(fn, timeout=5.0)
失败:
self.cv.wait_for(fn(1), timeout5.0)
这将产生错误“布尔不可调用”。
我尝试了以下操作:
self.cv.wait_for((fn(1)) , timeout=5.0)
结果:布尔不可赎回
self.cv.wait_for((fn, 1), timeout=5.0)
结果:元组对象不可调用
self.cv.wait_for((fn, 1)(), timeout=5.0)
结果:元组对象不可调用
self.cv.wait_for((fn(), 1), timeout=5.0)
结果:fn缺少1个必需的位置参数:'int'
fn是一个简单的函数,仅用于测试。
fn
:
def fn(int):
if int:
return True
else:
return False
非常感谢任何指导。
答案 0 :(得分:2)
Condition.wait_for
接受可调用的谓词,不接受任何参数。谓词的返回值可以是任何值,因为所有对象都具有布尔解释。
self.test
是可调用的,它接受一个参数,因此它不是合适的谓词。 self.test(1)
是调用方法的结果 ,该对象是bool
,不是可调用的。
在这种情况下,您使用lambda
的方法是最简单和最简单的:
self.cv.wait_for(lambda: self.test(1), timeout=5.0)
如果函数足够复杂,则可以通过适当的重构使它返回可调用的谓词,而不用将其包装在lambda中。例如:
def fn(i):
def preficate():
return bool(i)
return predicate
...
self.cv.wait_for(fn(1), timeout=5.0)
答案 1 :(得分:0)
我能够通过使用lambda来解决它:
self.cv.wait_for( lambda: self.test(1), timeout=5.0)
但是我很好奇是否还有其他方法吗?