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

Tob*_*ler 5 python tuples

现在关于如何解析字符串的大小和物理单位的问题已经解决了,接下来的问题是,如何最好地将这两者打包在一起,一方面不会花费太多的性能,而是另一方面增加了单元验证.

为了弄清楚我的意思,以一个例子两个速度v = 5 m/su = 10 mph.在先前的问题已经采取一切转化为照顾SI单位(这样你就不会崩溃另一个火星任务,由于).因此,内部可以有例如元组v = (5, m/s),u = (4.4704, m/s)并且输出例程将负责使用首选单位进行输出.虽然在两者上应用单位兼容的操作,例如加法或减去它们的正方形,但是有效,其他类似的v - 1/u是完整的和完全无意义的.但是如何最好地实施呢?到目前为止我考虑过的一些可能性:

  • 别.由于内部仅使用SI单位,因此可能很明显适用哪些单位.但如果公式变得更加复杂,忽视这些信息很可能成为错误的根源
  • 子类tuple并覆盖所有有效操作,前置单元一致性检查.听起来很有趣...
  • 将值存储为sympy.core.mul.Mul幅度乘以a(有意义的函数)的s sympy.physics.unit.Unit,例如v = 5*unit.m/unit.s.我不希望这有很好的表现,而且我仍然需要检查一个操作的结果是否仍然是形式magnitude * unit.
  • 使用numpy.array带有附加sympy.physics.unit.Unit条目的a,它已经实现了元素操作.这仍然需要事后进行手动单位一致性检查(例如m+m=2m,还需要对其进行处理......)
  • 没有单元的情况下调用数组上的-operators 之前,子类numpy.array代替tuple,覆盖运算符前面的单元一致性检查.也许一些魔法可以简化这一点,因为所有有效的操作都已经实现了幅度和单位......super__getattribute__

这些解决方案中的一个是好/ pythonic吗?或者还有其他什么方式?处理此问题的图书馆是否已经存在?

编辑请注意,这不应限于标量值; 向量,矩阵(甚至可能是sympy.Symbols)也应该有效

Bjö*_*ist 1

使用幅度库:

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')
Run Code Online (Sandbox Code Playgroud)

当单位不匹配时,有趣的事情就会发生:

>>> 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]
Run Code Online (Sandbox Code Playgroud)

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