Boolean operation of a Boolean variable on a symbol produces TypeError, but the reverse has no problem:
>>> from sympy import *
>>> x = Symbol('x', bool=True)
>>> x ^ True
Not(x)
>>> True ^ x
Traceback (most recent call last):
File "", line 1, in
True ^ x
TypeError: unsupported operand type(s) for ^: 'bool' and 'Symbol'
I can do try-catch:
try :
print True ^ x
except TypeError:
print x ^ True
Not(x)
But, for my present task, it is impossible to implement this with try-except as I have to deal with ~200 symbols. How can I achieve this?
解决方案
This is a bug, and it has been fixed in the development version of SymPy, and will be fixed in the next version. If you can't use the git version and can't wait, a workaround would be to monkeypatch __rxor__ (and so on) in sympy.logic.boolalg.Boolean to be equal to 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
By the way, Symbol('x', bool=True) does nothing. It adds the assumption x.is_bool to the Symbol, but since that isn't a real assumption that SymPy knows about, it doesn't do anything.