2014-10-27 35 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中這樣做。