На самом деле, когда вы вызываете sympify (str), он пытается проанализировать выражение и преобразовать их в классы по умолчанию. В этом случае будет вызван Add(2*x,2*x)
(с параметром по умолчанию evalaute = True), поэтому он стал 5*x
. Если вы хотите избежать этого, либо вы должны вызвать Add(2*x,3*x,evaluate=False)
, либо использовать некоторую глобальную переменную и проверить метод init класса AssocOp в core-> operation.py
Я делаю это
try:
import __builtin__
evaluate_expr=__builtin__.evaluate_expr
except AttributeError ,ex:
pass
if ((not options.pop('evaluate', True)) or (evaluate_expr==False)) :
** Примечание. Для функции используйте кеширование, поэтому если вы вызываете одну и ту же функцию (скажем: sympy("2*x+3*x")
) два раза. Первый раз с помощью переменной gloabl evalute=True
и второй раз с evaluate=False
. в обоих случаях из-за кеширования вы получите один и тот же результат.
Поэтому вам нужно обновить методы, такие как ( add , mul ) в классе core-> expr. что-то вроде ниже
def __add__(self, other):
#simplifychange:
evaluate_expr=self.get_evaluate()
return Add(self, other,evaluate=evaluate_expr)
Но я предположу, что было бы лучше, если бы вы не использовали оценку = Ложь. Поведение Симпи кардинально изменится. проблемы, с которыми я столкнулся в этом сообщении