在Python中将字符串转换为“unit”对象

2024-04-29 01:11:01 发布

您现在位置:Python中文网/ 问答频道 /正文

在这个问题中,“单位”是指物理量中使用的“计量单位”。

我想安全地解析一个包含物理量(例如“23kg”)的不可信用户输入字符串。我想使用Python可用的包之一(比如Unumquantitys),因为它们负责单位之间的转换、数学表达式中包含的单位的简化、基本单位的简化,但是除了使用eval()之外,我找不到一种将字符串转换为对象的方法,这看起来不安全。在

例如,假设kgcm绑定到Unumpackage对象并引用千克和厘米单位,那么我需要一个能够从字符串返回Unumpackage对象的函数,类似于:

cast_to_unit("100 kg/cm")

或者

"100 kg/cm".asUnit()

  1. 有没有办法从 提到的包裹?如果没有
  2. 有没有安全使用的方法 eval()?如果没有
  3. 还有其他的包裹吗 Python)有这样的功能吗?在

Tags: 对象方法字符串用户表达式evalcm单位
2条回答

Note: this is not a definitive answer. Please treat it as an example of how to build something similar to what you asked for. It is really a better idea to use Unum module, unless it does not fit your needs.

你可以自己写一些东西,像这样重载操作符:

>>> class Unit(object):
    def __init__(self, unit_name):
        self.unit_name = unit_name
        self.unit_qty = 1
    def __div__(self, other):
        result = self.__class__(self.unit_name)
        result.unit_qty = self.unit_qty / other
        return result
    def __rdiv__(self, other):
        result = self.__class__(self.unit_name)
        result.unit_qty = other / self.unit_qty
        return result
    def __mul__(self, other):
        result = self.__class__(self.unit_name)
        result.unit_qty = self.unit_qty * other
        return result
    def __rmul__(self, other):
        return self.__mul__(other)
    def __repr__(self):
        return '%s %s' % (self.unit_qty, self.unit_name)


>>> kg = Unit('kg')
>>> 100 * kg
100 kg
>>> 100 * 10 * kg
1000 kg
>>> (10 * 20 * kg) / 2
100 kg

然后可以使用eval()来计算表达式(比如“100*kg”),但要小心。或许这可以帮助你解决一些问题:

^{pr2}$

快速浏览一下Unumdocumentation,似乎您应该能够使用^{}执行类似的操作:

from unum.units import * # Load a number of common units.
distance = 100*m
time = eval('9.683*s')
speed = distance / time
print(speed)

如果您这样做,请确保阅读了eval的文档,以及如何传递本地和全局映射,以限制命名空间访问,使其更安全,尤其是如果您计划将此代码发布给外部世界时。您可能还需要检查字符串中是否有下划线(_),而不允许将这些下划线传递给eval。在


正如kindall所指出的,导入*通常不是好的风格。这里有一个更安全的替代方法,它可以避免从*导入:

^{pr2}$

请注意,我删去了__方法,如本文post所提倡的

相关问题 更多 >