2014-10-27 41 views
2

我有一个validate_until_true函数,它轮询函数的返回值,直到它满足给定的条件或超时。lambda的字符串表示

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,我希望能够打印一条消息。

是否有可能沿的线条打印的东西: “VA = 2和VB == 2”

条件没有得到满足,V的值有: A = 1, b = 2,c = 3

我该怎么做?

回答

2

也许我误解了你的问题,但(AFAIK)除了解析源代码之外,你无法真正了解函数的字符串表示形式,不管它是用def还是lambda定义的。即使你可以,我认为这不是一个有用的方式来做你想做的事情。 :)

总之,为了Test.test()打印消息你想,如果validate_until_true()返回false Test.test()需要访问的最后vcondition测试。在你发布的代码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中这样做。