mmj*_*mmj 1 python string casting units-of-measurement
在这个问题中,"单位"是指物理量中使用的"度量单位".
我想安全地解析包含物理量(例如'23 kg')的不可信用户输入字符串.我想使用一个可用于Python的软件包(如Unum或Quantities),因为它们负责单元之间的转换,简化数学表达式中包含的单元,减少到基本单元,但我找不到办法将字符串转换为除了使用之外的(上述包的)对象eval(),这似乎是不安全的.
例如,假设kg并且cm绑定到Unum包对象并引用千克和厘米单位,我需要一个能够从字符串返回Unum包对象的函数,如:
cast_to_unit("100 kg/cm")
要么
"100 kg/cm".asUnit()
eval()?如果不,以快速浏览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)
请注意,我切出的__方法,如本倡导岗位
| 归档时间: |
|
| 查看次数: |
813 次 |
| 最近记录: |