标题说明了一切......为什么sympy有以下行为?
import sympy.physics.units as u
print(0*u.meter)
# >>> 0
Pint有这种行为:
import pint
u = pint.UnitRegistry()
print(0*u.meter)
# >>> 0 meter
我认为我更喜欢品脱的行为,因为它允许尺寸一致性。 0是某个单位的适当大小。例如,0度开尔文具有明确的含义......这不仅仅是没有任何东西......
所以我意识到sympy的贡献者可能出于某种原因选择了这个实现。你能帮我看看光吗?
关于实现原因的讨论属于GitHub(我在哪里raised this issue),而不是在这里。一个简短的答案是单位是一个螺栓固定的结构; SymPy的核心并不是真正的单位意识。
您可以通过将evaluate = False参数传递给Mul来创建0*meter
表达式:
>>> Mul(0, u.meter, evaluate=False)
0*meter
但是,如果与其他内容结合使用,它将变为0。
>>> 3*Mul(0, u.meter, evaluate=False)
0
在UnevaluatedExpr中包装会阻止上述操作,但会导致比解决的问题更多的问题。
>>> 3*UnevaluatedExpr(Mul(0, u.meter, evaluate=False))
3*(0*meter)