Python:带有参数的队列方法wait_for谓词

时间:2018-11-17 20:31:08

标签: python python-3.x

我正在尝试利用队列模块的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

非常感谢任何指导。

2 个答案:

答案 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)

但是我很好奇是否还有其他方法吗?

相关问题