既然如何解析字符串的大小和物理单位的问题已经解决了,下一个问题是,如何最好地继续将这两者打包在一起,一方面不会花费太多性能,但另一方面添加了单元验证。
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.Mul
s 的大小乘以 a(的有意义函数)sympy.physics.unit.Unit
,例如v = 5*unit.m/unit.s
。我不希望它有很好的性能,而且我仍然需要检查操作的结果是否仍然是 formmagnitude * unit
。 - 将 a与已实现元素操作
numpy.array
的附加条目一起使用。sympy.physics.unit.Unit
这仍然需要事后进行手动单元一致性检查(事实上,例如m+m=2m
也需要处理......) - 子类
numpy.array
而不是,在调用没有单元的数组上的 -tuple
运算符之前覆盖在单元一致性检查之前的运算符。也许一些魔法可以简化这一点,因为所有有效的操作都已经实现了幅度和单位......super
__getattribute__
这些解决方案之一是好的/pythonic吗?或者还有什么其他方法?是否已经存在处理此问题的库?
编辑请注意,这不应仅限于标量值;向量、矩阵(甚至可能是sympy.Symbol
s)也应该可以工作