如何让Checkers逻辑表达式延迟至TestBox.run()调用时求值?
实现延迟执行的逻辑表达式校验
你遇到的核心问题是:普通的and运算符会立即求值,所以Checkers.begin_with("op") and Checkers.end_with("or")在创建TestBox实例时就会算出布尔值,而不是等到调用run()时才校验输入字符串。要解决这个问题,我们需要把每个检查规则包装成延迟计算的可调用对象,并重载逻辑运算符来组合这些对象,而不是直接返回布尔结果。
下面是完整的实现方案:
1. 定义可组合的Checker类
首先创建一个Checker类,它会包装校验逻辑,同时支持通过and(或or)组合多个校验规则:
class Checker: def __init__(self, validate_func): # 保存校验逻辑的函数 self.validate = validate_func def __call__(self, input_str): # 让Checker实例可以像函数一样被调用,执行校验 return self.validate(input_str) def __and__(self, other_checker): # 重载and运算符,返回一个新的Checker,同时满足两个校验规则 return Checker(lambda s: self(s) and other_checker(s)) def __or__(self, other_checker): # 可选:重载or运算符,支持任意一个规则满足即可 return Checker(lambda s: self(s) or other_checker(s))
2. 实现Checkers工具类
接下来用静态方法封装常用的校验规则,每个方法返回一个Checker实例:
class Checkers: @staticmethod def begin_with(prefix): return Checker(lambda s: s.startswith(prefix)) @staticmethod def end_with(suffix): return Checker(lambda s: s.endswith(suffix)) # 可以添加更多校验规则,比如包含特定字符串 @staticmethod def contains(substr): return Checker(lambda s: substr in s)
3. 实现TestBox类
TestBox只需要保存组合后的Checker对象,在run()方法中调用它完成校验:
class TestBox: def __init__(self, combined_checker): self.checker = combined_checker def run(self, input_str): return self.checker(input_str)
4. 测试验证
现在你可以按照预期的方式使用了:
test_box = TestBox(Checkers.begin_with("op") and Checkers.end_with("or")) print(test_box.run("operator")) # 输出 True print(test_box.run("option")) # 输出 False # 试试or组合的例子 test_box_or = TestBox(Checkers.begin_with("op") or Checkers.end_with("on")) print(test_box_or.run("option")) # 输出 True
为什么这个方案可行?
Checkers.begin_with("op")返回的不是布尔值,而是一个Checker实例(Python中所有对象默认都是“真值”)。- 当使用
and运算符时,Python会先判断左边的真值,然后调用左边实例的__and__方法,把右边的Checker传进去,返回一个新的组合校验器。 - 直到调用
run()方法时,才会把输入字符串传入组合后的校验器,执行真正的校验逻辑。
内容的提问来源于stack exchange,提问作者QooBee
相关产品推荐
相关产品推荐

