我有一个 validate_until_true
函数,它轮询函数的返回值,直到满足给定条件或超时。
from collections import namedtuple
import time
A = namedtuple("A", "a b c")
def validate_until_true(f, condition, timeout):
t = time.time() + timeout
while time.time() < t:
v = f()
if condition(v): return True
time.sleep(1)
return False
class Test:
def __init__(self, param):
self.param=param
def test(self):
f = lambda: A(1,2,3)
print(validate_until_true(f, lambda v: v.a!=self.param and v.b==2, 2))
Test(1).test()
我希望能够在 validate_until_true
返回 False 时打印一条消息。
是否可以打印如下内容:
The condition "v.a!=2 and v.b==2" has not been met, v has the values: a=1, b=2, c=3
我怎样才能做到这一点?
最佳答案
也许我误解了你的问题,但是(AFAIK)你无法真正获得函数的字符串表示形式,无论它是使用 def
还是 lambda
定义的>,除了解析源代码。即使你可以,我认为这也不是做你想做的事情的有用方法。 :)
无论如何,为了让 Test.test()
在 validate_until_true()
返回 false Test.test()
时打印您想要的消息> 需要访问 condition
测试的最终 v
。在您发布的代码中, v
只是一个常量,但我假设您想要处理一般情况。因此,您需要更改 validate_until_true()
以将 v
传递回其调用者。例如:
#! /usr/bin/env python
from collections import namedtuple
import time
A = namedtuple("A", "a b c")
def validate_until_true(f, condition, timeout):
t = time.time() + timeout
while time.time() < t:
v = f()
if condition(v): return True, v
#print('.')
time.sleep(1)
return False, v
class Test:
def __init__(self, param):
self.param=param
def test(self):
f = lambda: A(1,2,3)
condition = lambda v: v.a!=self.param and v.b==2
result, v = validate_until_true(f, condition, 3)
if result:
print('True')
else:
msg = 'The condition "v.a!={0} and v.b==2" has not been met, v has the values: {1}'
print(msg.format(self.param, str(v)[2:-1]))
t = Test(1)
t.test()
p = 7
print('Setting param to {0}'.format(p))
t.param = p
t.test()
这符合你的要求吗,还是我找错了树? :)
FWIW,我正在 Python 2.6 中执行此操作。
关于python - lambda 的字符串表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26581827/