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

mmj*_*mmj 1 python string casting units-of-measurement

在这个问题中,"单位"是指物理量中使用的"度量单位".

我想安全地解析包含物理量(例如'23 kg')的不可信用户输入字符串.我想使用一个可用于Python的软件包(如UnumQuantities),因为它们负责单元之间的转换,简化数学表达式中包含的单元,减少到基本单元,但我找不到办法将字符串转换为除了使用之外的(上述包的)对象eval(),这似乎是不安全的.

例如,假设kg并且cm绑定到Unum包对象并引用千克和厘米单位,我需要一个能够从字符串返回Unum包对象的函数,如:

cast_to_unit("100 kg/cm")

要么

"100 kg/cm".asUnit()

  1. 有没有办法从提到的包中获得这样的功能?如果不,
  2. 有没有办法安全使用 eval()?如果不,
  3. 有没有其他包(甚至不是在Python中)具有这样的功能?

mgi*_*son 5

以快速浏览Unum文档,看来,你应该能够做这样的事情有eval:

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

如果您这样做,请确保您阅读文档eval以及如何传递本地和全局映射,以限制命名空间访问以使其更安全 - 特别是如果您计划将此代码发布到外部世界.您可能还想检查下划线(_)的字符串,不允许传递给它们eval.


正如kindall所说,进口*通常不是好的风格.这是一个稍微更安全的替代方案,可避免从*以下位置导入:

import unum.units
safe_dict = dict((x,y) for x,y in unum.units.__dict__.items() if '__' not in x)
safe_dict['__builtins__'] = None

def convert(s):
    if '__' in s:
       raise ValueError("Won't do this with underscores...it's unsafe")
    return eval(s,safe_dict)
Run Code Online (Sandbox Code Playgroud)

请注意,我切出的__方法,如本倡导岗位