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

Python中能否为双参数返回布尔值的函数重载逻辑运算符?

可行性说明

Python原生不支持为普通函数直接重载运算符,但你描述的逻辑组合需求完全可以实现,核心方案是通过自定义可调用类,重载&/|对应的魔法方法,为判断函数增加组合能力,不需要修改现有判断函数的内部逻辑。

具体实现

核心思路是定义一个谓词包装类:

  • 类实例接收原判断函数作为初始化参数
  • 实现__call__方法让实例可以像普通函数一样被调用
  • 重载__and__、__or__魔法方法,对应&、|运算符,运算后返回新的包装类实例,调用时按布尔逻辑执行组合判断

完整实现代码:

class Predicate:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        return bool(self.func(*args, **kwargs))

    def __and__(self, other):
        @Predicate
        def combined(*args, **kwargs):
            return self(*args, **kwargs) and other(*args, **kwargs)
        return combined

    def __or__(self, other):
        @Predicate
        def combined(*args, **kwargs):
            return self(*args, **kwargs) or other(*args, **kwargs)
        return combined

使用时只需要给你现有的判断函数加上@Predicate装饰器即可,原有逻辑无需改动:

@Predicate
def both_positive(a, b):
    return a > 0 and b > 0

@Predicate
def larger(a, b):
    return a > b

@Predicate
def both_negative(a, b):
    return a < 0 and b < 0

# 直接用运算符组合逻辑
func = both_positive & larger
# 支持多条件复杂组合,运算符优先级和原生布尔逻辑一致:&优先级高于|
# complex_customized_logic = both_positive | larger & both_negative

# 验证结果
assert func(3, 1) is True
assert func(2, -1) is False
扩展能力
  • 如果你需要支持逻辑非运算,可以在Predicate类中追加__invert__方法重载~运算符:
def __invert__(self):
    @Predicate
    def negated(*args, **kwargs):
        return not self(*args, **kwargs)
    return negated

# 用法示例:not_positive = ~both_positive
  • 如果你不想修改原有函数的定义,也可以在组合时手动包装:func = Predicate(both_positive) & Predicate(larger),效果和加装饰器完全一致
  • 该方案不限制判断函数的参数个数,只要参与组合的函数参数签名匹配即可,关键字参数也能正常透传

内容的提问来源于stack exchange,提问作者xyshell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:24:19