现在how to parse a string for magnitude and physical unit的问题已经解决了,接下来的问题是,如何最好地将这两者组合在一起,一方面不会花费太多的性能,另一方面又会花费太多手增加了单位验证。
为了明确我的意思,以两个速度v = 5 m/s
和u = 10 mph
为例。 previous question已经负责将所有内容转换为SI units(因此, 会因此而不会crash another Mars mission。所以在内部可以有例如元组v = (5, m/s)
和u = (4.4704, m/s)
,输出例程将负责使用首选单位进行输出。在两者上应用单元兼容操作时,例如另外,或者减去它们的方块是有效的,像v - 1/u
这样的其他人是完整的,完全是胡说八道。但是如何最好地实施呢?到目前为止我考虑过的一些可能性:
tuple
并覆盖所有有效操作,前置单元一致性检查。听起来很有趣...... sympy.core.mul.Mul
s的大小乘以sympy.physics.unit.Unit
的{有意义函数',例如v = 5*unit.m/unit.s
。我不希望这有很好的表现,而且我还是要检查一个操作的结果是否仍然是magnitude * unit
形式。numpy.array
与另一个sympy.physics.unit.Unit
条目一起使用,该条目已实现了元素运算。这仍然需要事后进行手动单位一致性检查(例如m+m=2m
也需要处理......)numpy.array
而不是tuple
,在调用数组上的super
- 运算符之前覆盖运算符前面的单元一致性检查,而不用< / em>单位。也许一些__getattribute__
魔法可以简化这一点,因为所有有效的操作都已经实现了大小和单位...... 这些解决方案中的一个是好/ pythonic吗?或者还有其他什么方式?处理这个问题的图书馆是否已经存在?
编辑请注意,这不应限于标量值;向量,矩阵(甚至可能sympy.Symbol
s)也应该起作用
答案 0 :(得分:1)
使用Magnitude库:
from magnitude import mg
m = mg(5, 'kg')
a = mg(9.82, 'm/s2')
f = m * a
print f, f == mg(49.1, 'N')
u = mg(70, 'km/h')
g = mg(9.82, 'm/s2')
s = (u**2) / (2*g)
print s, s > mg(10, 'm')
当单位不匹配时会发生有趣的事情:
>>> m = mg(5, 'kg')
>>> a = mg(9.82, 'm/s')
>>> f = m * a
>>> print f, f == mg(49.1, 'N')
MagnitudeError: Incompatible units in comparison: [1, -2, 0, 1, 0, 0, 0, 0, 0] and [1, -1, 0, 1, 0, 0, 0, 0, 0]
也许不是最好的错误消息,但它会有效地阻止您以错误的方式处理值。