Логическая операция с символом в Sympy

Булева операция булевой переменной над символом дает 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 символами. Как я могу этого добиться?


person hola    schedule 31.10.2013    source источник
comment
Если вам приходится иметь дело с 200 символами; Я надеюсь, вы используете цикл. Если да, то почему вы не можете использовать блок try-except?   -  person ThinkChaos    schedule 31.10.2013
comment
@plg Я использую numpy.array, S, с произвольно смешанными символами и логическими значениями. У меня есть такие операции, как: S[15] ^ (S[19] & S[72]) ^ S[112]. Теперь, не зная, какой из них является логическим, а какой символьным, я не могу выполнять операции try-except, поскольку количество таких блоков try-except будет расти в геометрической прогрессии.   -  person hola    schedule 31.10.2013
comment
Чтобы использовать цикл, вы можете определить список кортежей: [(15, 19, 73, 112), ...] это не сработает, если это не всегда одни и те же операции. Вы также можете использовать список выражений ['S[15] ^ (S[19] & S[72]) ^ S[112]', ...] и eval их внутри try-except. Я бы не стал этого делать, если бы у меня не было другого решения.   -  person ThinkChaos    schedule 31.10.2013
comment
@plg Все еще не ясно. Вы можете дать мне MWE?   -  person hola    schedule 31.10.2013
comment
Для справки на будущее, что такое MWE?   -  person ThinkChaos    schedule 31.10.2013
comment
Минимальный рабочий пример :-) Сейчас работаю над вашим кодом.   -  person hola    schedule 31.10.2013


Ответы (2)


Это ошибка, и она была исправлена ​​в разрабатываемой версии SymPy и будет исправлена ​​в следующей версии. Если вы не можете использовать git-версию и не можете ждать, обходной путь будет состоять в том, чтобы __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 знает, он ничего не делает.

person asmeurer    schedule 05.11.2013

Это уродливо, но оно должно делать то, что вы хотите:

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

for e in expressions:
  try:
    eval(e) # Do your thing
  except TypeError:
    pass
person ThinkChaos    schedule 31.10.2013