重载python三元运算符

时间:2015-02-18 03:21:44

标签: python operator-overloading ternary-operator

是否有可能在python中重载三元运算符?基本上我想要的是:

class A(object):
    def __ternary__(self, a, c):
        return a + c

a = A()
print "asdf" if a else "fdsa" # prints "asdffdsa"

我正在尝试实现一个符号包,基本上想要一些可以做的事情:

sym = Symbol("s")
result = 1 if sym < 3 else 10
print result.evaluate(sym=2) # prints 1
print result.evaluate(sym=4) # prints 10

编辑:让我提出一个更复杂的例子,说明如何将其分层。

sym = Symbol("s")
result = 1 if sym < 3 else 10
...
something_else = (result+1)*3.5
...
my_other_thing = sqrt(something_else)

print my_other_thing.evaluate(sym=2) # prints sqrt(7) or rather the decimal equivalent

关键是,我不需要能够延迟评估一个三元运算符,我需要在最终评估之前获取结果并使用其他符号。此外,我的代码可以进行部分评估,我给它一些绑定,如果它不能评估完整的表达式,它会返回另一个符号表达式。

我的备份计划只是直接使用三元类来获取我需要制作的3个表达式对象。我只是试图用操作符重载来隐藏这个类的生成。基本上是:

a = TernaryOperator(a,b,c)
# vs
b = a if b else c

2 个答案:

答案 0 :(得分:1)

  1. 查看sympy module;它已经做到了这个

  2. 进行简单比较,编写A.__eq__A.__lt__方法并使用total_ordering class decorator;这应足以比较两个AA和一个常数

  3. 将其写为lambda,

    result = lambda sym: 1 if sym < 3 else 10
    print(result(2))    # => 1
    print(result(4))    # => 10
    

答案 1 :(得分:0)

重载比较运算符(无论如何你可能需要做的事情):

class A(object):
    def __lt__(self, other):
        return self.value() < other.value() # Replace with your own implementation of <

然后,使用lambda函数来实现所需的延迟评估:

sym = Symbol("s")
result = lambda s: 1 if s < 3 else 10
sym.set(2)
print result(sym) # prints 1
sym.set(4)
print result(sym) # prints 10

(我认为你不能重载赋值运算符,因为它实际上并不对任何对象执行操作,而是对变量执行操作。)