You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:27:54