Проблема возникает во время if
:
from sympy import Function
class ifte(Function):
nargs = 3
@classmethod
def eval(cls, a, b, c):
if a > 0: # <-- PROBLEM HERE
return b
else:
return c
и связана с type
, который получает a
. Поскольку это зависит от выражения в a
, вы можете наблюдать различные варианты поведения для разных выражений. В частности, для некоторых значений a
это будет sympy.logic.boolalg.*
. Если это так, то метод __gt__
(который вызывается при использовании оператора >
) не определен, и вы получаете ошибку, которую вы наблюдаете. Для некоторых других значений это будет простой bool
, для которого определен метод __gt__
и код работает так, как вы ожидаете.
Для решения проблемы просто удалите > 0
сравнение, т.е.
from sympy import Function
class ifte(Function):
nargs = 3
@classmethod
def eval(cls, a, b, c):
if a:
return b
else:
return c
или, еще проще:
from sympy import Function
class ifte(Function):
nargs = 3
@classmethod
def eval(cls, a, b, c):
return b if a else c
print(ifte('1+2 and True and 1 != 2', 'b', 'c'))
# b
print(ifte('1==0', 'b', 'c'))
# c
print(ifte('1>0', 'b', 'c'))
# b
print(ifte('1<0', 'b', 'c'))
# c
Обратите внимание, что полученное сообщение об ошибке немного зависит от имеющейся версии SymPy, но принципта же. Например, в версии 1.1.1
я получаю:
TypeError: '>' не поддерживается между экземплярами 'BooleanTrue' и 'int'