Python lambda的字符串表示

Python lambda的字符串表示,python,python-2.7,lambda,Python,Python 2.7,Lambda,我有一个validate\u until\u 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

我有一个
validate\u until\u 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()
从集合导入namedtuple
导入时间
A=命名双倍(“A”、“A、b、c”)
def验证_直到_为真(f、条件、超时):
t=time.time()+超时
而time.time()
我希望能够打印一条消息,如果
validate\u,直到\u true
返回False

是否可以按照以下内容打印一些内容:

未满足条件“v.a!=2和v.b==2”,v具有以下值: a=1,b=2,c=3


我怎么能这样做

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

无论如何,为了让
Test.Test()
打印您想要的消息,如果
validate\u直到
返回false
Test,Test()
需要访问
条件测试的最终
v
。在您发布的代码中,
v
只是一个常量,但我假设您希望处理一般情况。因此,您需要更改
validate\u直到\u 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()
#/usr/bin/env python
从集合导入namedtuple
导入时间
A=命名双倍(“A”、“A、b、c”)
def验证_直到_为真(f、条件、超时):
t=time.time()+超时
而time.time()
这是你想要的吗,还是我找错人了

FWIW,我在Python2.6中这样做