符号上布尔变量的布尔运算产生TypeError
,但反过来没有问题:
>>> from sympy import *
>>> x = Symbol('x', bool=True)
>>> x ^ True
Not(x)
>>> True ^ x
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
True ^ x
TypeError: unsupported operand type(s) for ^: 'bool' and 'Symbol'
我可以试试看:
try :
print True ^ x
except TypeError:
print x ^ True
Not(x)
但是,对于我目前的任务,我不可能用try-except
来实现它,因为我必须处理~200个符号。我怎样才能做到这一点?
答案 0 :(得分:2)
这是一个错误,它已在SymPy的开发版本中修复,并将在下一版本中修复。如果您无法使用git版本且无法等待,则解决方法是__rxor__
中的monkeypatch sympy.logic.boolalg.Boolean
(等等)等于sympy.logic.boolalg.Boolean.__xor__
。
In [1]: from sympy.logic.boolalg import Boolean
In [2]: Boolean.__rxor__ = Boolean.__xor__
In [3]: True ^ x
Out[3]: ¬ x
顺便说一句,Symbol('x', bool=True)
什么也没做。它为符号添加了假设x.is_bool
,但由于这不是SymPy所知道的真实假设,因此它不会做任何事情。
答案 1 :(得分:-1)
这很难看,但应该做你想做的事情:
expressions = [
r'S[15] ^ (S[19] & S[72]) ^ S[112]',
]
for e in expressions:
try:
eval(e) # Do your thing
except TypeError:
pass