Python "安全" eval(字符串转bool/int/float/None/string)
我正在制作一个网页应用程序,用来处理一些数据,所以我经常需要把字符串(比如来自网址或文本文件的内容)转换成Python能理解的值。
我使用的一个函数可以算是eval的一个更安全的版本(不过如果它不能读取字符串,结果还是字符串):
def str_to_value(string):
for atom in (True, False, None):
if str(atom) == string:
return atom
else:
try:
return int(string)
except ValueError:
try:
return float(string)
except ValueError:
return string
... 不过,我觉得这样做看起来很丑陋。有没有更简洁的方法呢?我找到过一个旧讨论,讨论的就是类似的问题,但我在想有没有什么快速简单的方法(比如我不知道的库函数,或者聪明的一行代码)?
1 个回答
30
ast.literal_eval()
是一个 Python 的函数,用来安全地将字符串转换成 Python 的数据类型,比如数字、列表、字典等。这个函数特别好用,因为它只会处理一些简单的、基本的 Python 数据结构,不会执行任何代码,这样可以避免安全问题。
>>> ast.literal_eval('{False: (1, 0x2), True: [3.14, 04, 0b101], None: ("6", u"7", r\'8\')}')
{False: (1, 2), True: [3.1400000000000001, 4, 5], None: ('6', u'7', '8')}