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

标签 python string casting units-of-measurement

<分区>

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

我想安全地解析包含物理量(例如“23 公斤”)的不受信任的用户输入字符串。我想使用 Python 可用的包之一(如 UnumQuantities),因为它们负责单位之间的转换,简化数学表达式中包含的单位,减少到基本单位,但除了使用 eval() 之外,我找不到将字符串转换为(上述包的)对象的方法,这似乎不安全。

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

cast_to_unit("100 kg/cm")

"100 kg/cm".asUnit()

  1. 有没有办法从一个 提到包?如果没有,
  2. 有没有办法安全使用 评估()?如果没有,
  3. 是否还有其他包裹(即使不在 Python)有这样的功能吗?

最佳答案

快速浏览一下 Unumdocumentation , 看起来你应该能够用 eval 做这样的事情:

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 所指出的,导入 * 通常不是好的风格。这是一个稍微更安全的替代方案,它避免从 * 导入:

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)

请注意,我删除了此 post 中提倡的 __ 方法

关于python - 在 Python 中将字符串转换为 'unit' 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13611851/

相关文章:

python - 解析 ajax 响应以检索 Scrapy 中的最终 url 内容?

arrays - 在另一个用户中插入 ObjectId - Parse 和 Swift

java - Java 中扩大类型转换

java - 将泛型类型乘以二 - 二叉树方法

python - 如何检查两个列表的元素组合是否存在于第三个列表中?

python - Matplotlib - 绘制非均匀线分布

sql - 使用 Postgres 中的 Overlay 函数在不同位置更新同一列的多个值

c - 链表 C/Struct

c++ - 在遗留代码上规避 RTTI

python - like() 得到了意外的关键字参数 'story_id'