sympy.core.basic.Basic.doit(**提示)
计算默认情况下不计算的对象,例如极限、积分、总和和乘积。所有此类对象都将被递归评估,除非通过“提示”排除某些物种或除非“深度”提示设置为“False”。
但是我找不到任何关于如何执行此操作的解释。
我尝试查看源代码并遵循
.doit()
方法对 **hints
参数所做的操作,但是对于我检查过的每个类,它都有针对类特定提示的显式代码,并且当它出现时,其他所有内容都会被启动在其子元素上调用 .doit(**hints)
。由于没有检查模块中每个类的 .doit()
方法,我无法想出如何弄清楚如何执行文档声称的操作。
有人知道该怎么做吗?
这是一个我想做的事情的快速示例,这会很有用。如果我运行以下代码:
from sympy import *
from sympy.physics.quantum import Commutator
A,B = symbols('A B', commutative=False)
x = symbols('x')
expr = 1 + Integral(Commutator(A,B),(x,0,2))
expr.doit()
我得到了输出
>>> 1 + 2(AB-BA)
这是正确的,但是我想保持换向器完好无损并得到
>>> 1 + 2[A,B]
如果我设置
deep=False
那么我只会得到未计算的表达式,大概是因为表达式的最外层是已经计算过的加法,可以这么说。在这种情况下,我当然可以迭代表达式并告诉它用
deep=False
计算积分并得到我想要的东西,但对于更复杂的表达式,我想在评估其他所有内容的同时保持换向器完整,这样更有意义能够告诉 sympy 不要打扰换向器。将换向器创建为 UnevaluatedExpr(Commutator(A,B))
也没有帮助,因为运行
.doit()
显然只会炸穿该保护层。