如何pythonically tuple量级和物理单位?

时间:2013-04-10 08:35:24

标签: python tuples

现在how to parse a string for magnitude and physical unit的问题已经解决了,接下来的问题是,如何最好地将这两者组合在一起,一方面不会花费太多的性能,另一方面又会花费太多手增加了单位验证。

为了明确我的意思,以两个速度v = 5 m/su = 10 mph为例。 previous question已经负责将所有内容转换为SI units(因此, 会因此而不会crash another Mars mission。所以在内部可以有例如元组v = (5, m/s)u = (4.4704, m/s),输出例程将负责使用首选单位进行输出。在两者上应用单元兼容操作时,例如另外,或者减去它们的方块是有效的,像v - 1/u这样的其他人是完整的,完全是胡说八道。但是如何最好地实施呢?到目前为止我考虑过的一些可能性:

  • 别。由于内部仅使用SI单位,因此可能明显适用哪些单位。但如果公式变得更加复杂,忽视这些信息很可能成为错误的来源
  • 子类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)也应该起作用

1 个答案:

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

也许不是最好的错误消息,但它会有效地阻止您以错误的方式处理值。