是否有可能在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
答案 0 :(得分:1)
查看sympy
module;它已经做到了这个
进行简单比较,编写A.__eq__
和A.__lt__
方法并使用total_ordering class decorator;这应足以比较两个A
或A
和一个常数
将其写为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
(我认为你不能重载赋值运算符,因为它实际上并不对任何对象执行操作,而是对变量执行操作。)