В this answer объясняется, как избежать args
быть отсортированы по классам SymPy как Mul
, Add
и так далее.SymPy, можно заставить класс остаться на левой или на правой стороне выражения
Для нового созданного класса like this one explained here он может перейти к правой стороне, когда умножается на sympy.core.numbers.Float
, sympy.core.numbers.Pi
или sympy.core.numbers.Integer
, например, давая:
print D(x) * 1.
1.0*D(x)
Исходное выражение дает 0.
при оценке, в то время как новый дает D(x)
.
Для того, чтобы этот дифференциальный оператор, чтобы работать должным образом, она должна остаться на левой стороне:
print D(x) * 1.
D(x)*1.0
Есть ли скрытый параметр, как _op_priority
для изменения __mul__()
приоритета, который говорит SymPy типа, который остается больше влево или вправо?
Вопрос в порядке сам по себе, но если вы используете его для создания дифференциального оператора, вы, вероятно, делаете это неправильно. Прежде всего, использование умножения для дифференциальных операторов является непоследовательным злоупотреблением обозначением. Кроме того, такой подход не может четко представлять вложенные дифференциальные операторы или суммы констант и дифференциальных операторов и т. Д. Более того, дифференциальные операторы уже реализованы в модуле 'diffgeom'. – Krastanov
благодарим вас за комментарий! У меня много проблем с использованием этого дифференциального оператора, но он работает до сих пор. Вы знаете, как заставить данный класс оставаться на левой/правой стороне в SymPy? –
Я не знаю достаточно деталей, чтобы написать это как ответ, но вы можете попытаться использовать 'commutative = False'. Мне очень не нравится этот подход и надеюсь, что в какой-то будущей версии sympy это будет удалено (таких планов нет), но если вы знаете, что делаете, продолжайте и попробуйте. – Krastanov