为什么不同意支持0级的单位?

时间:2018-03-03 13:14:22

标签: python sympy units-of-measurement

标题说明了一切......为什么同情会有以下行为?

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的贡献者可能出于某种原因选择了这个实现。你能帮我看看光吗?

1 个答案:

答案 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)