标题说明了一切......为什么同情会有以下行为?
import sympy.physics.units as u
print(0*u.meter)
# >>> 0
Pint有这种行为:
import pint
u = pint.UnitRegistry()
print(0*u.meter)
# >>> 0 meter
我认为我更喜欢pint的行为,因为它允许尺寸一致性。 0是某个单位的适当大小。例如,0度开尔文具有明确的意义......这不仅仅是没有任何东西......
所以我意识到sympy的贡献者可能出于某种原因选择了这个实现。你能帮我看看光吗?
答案 0 :(得分:1)
关于实施原因的讨论属于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
Wnepping in UnevaluatedExpr可以防止上述问题,但会导致比解决方案更多的问题。
>>> 3*UnevaluatedExpr(Mul(0, u.meter, evaluate=False))
3*(0*meter)