1

布尔变量对符号的布尔运算产生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 个符号。我怎样才能做到这一点?

4

2 回答 2

2

这是一个bug,在SymPy的开发版中已经修复,下个版本会修复。如果您不能使用 git 版本并且等不及了,解决方法是将monkeypatch __rxor__(等等)输入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 知道的真实假设,因此它什么也不做。

于 2013-11-05T01:18:38.930 回答
-1

这很丑陋,但它应该做你想做的事:

expressions = [
  r'S[15] ^ (S[19] & S[72]) ^ S[112]',
]

for e in expressions:
  try:
    eval(e) # Do your thing
  except TypeError:
    pass
于 2013-10-31T10:31:26.147 回答