5

既然如何解析字符串的大小和物理单位的问题已经解决了,下一个问题是,如何最好地继续将这两者打包在一起,一方面不会花费太多性能,但另一方面添加了单元验证。

v = 5 m/s为了清楚我的意思,以两个速度和为例u = 10 mph。上一个问题已经处理了将所有内容转换为SI 单位的问题(因此您不会因此而导致另一个火星任务崩溃)。所以在内部会有一个元组,并且输出例程将负责使用首选单元进行输出。虽然在两者上应用单位兼容的操作,例如加法或减法,是有效的,但其他类似的操作是完整的,完全是胡说八道。但这应该如何最好地实施呢?到目前为止我考虑的一些可能性:v = (5, m/s)u = (4.4704, m/s)v - 1/u

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

这些解决方案之一是好的/pythonic吗?或者还有什么其他方法?是否已经存在处理此问题的库?

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

4

1 回答 1

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')

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

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

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

于 2013-04-10T09:51:51.550 回答