2014-10-27 4 views
2

Функция hava a 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.

Можно ли напечатать что-то вдоль линий: "! Уа = 2 и VB == 2"

Условия не был выполнен, v имеет значение: а = 1, b = 2, c = 3

Как я могу это сделать?

ответ

2

Возможно, я не понимаю ваш вопрос, но (AFAIK) вы не можете получить строковое представление функции, независимо от того, было ли оно определено с помощью def или lambda, кроме разбора исходного кода. И даже если бы вы могли, я не думаю, что это был бы полезный способ сделать то, что вы хотите сделать. :)

Во всяком случае, в течение Test.test() для того, чтобы напечатать сообщение, которое вы хотите, если validate_until_true() возвращает ложные Test.test() потребности доступа к конечным v что condition испытаний. В коде, который вы опубликовали 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.

Смежные вопросы