lambda的字符串表示

2 投票
1 回答
879 浏览
提问于 2025-04-29 20:37

我有一个叫做 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,能够打印一条消息。

我想打印的内容大概是这样的:

条件 "v.a!=2 and v.b==2" 没有满足,v 的值是: a=1, b=2, c=3

我该怎么做呢?

暂无标签

1 个回答

2

也许我误解了你的问题,但据我所知,不管是用 def 还是 lambda 定义的函数,你都不能直接获取它的字符串表示,除非你去解析源代码。即使你能做到,我觉得这也不是实现你想要的功能的好方法。:)

无论如何,为了让 Test.test()validate_until_true() 返回假值时打印你想要的消息,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()

这样做能达到你想要的效果吗,还是我理解错了?:)

顺便说一下,我是在 Python 2.6 中做这个的。

撰写回答