我正在尝试(稍微)改进一个脚本,该脚本对某些配置文件进行快速而苛刻的解析。
在识别出从文件中读取的“项目”时,我需要尝试将其转换为简单的python值。值可以是数字或字符串。
要将从文件中读取的字符串转换为Python数字,我可以使用int
或float
并捕获ValueError
(如果它实际上不是数字)。 Python字符串有类似的东西吗?即。
s1 = 'Goodbye World. :('
s2 = repr(s1)
s3 = ' "not a string literal" '
s4 = s3.strip()
v1 = parse_string_literal(s1) # throws ValueError
v2 = parse_string_literal(s2) # returns 'Goodby World. :('
v3 = parse_string_literal(s3) # throws ValueError
v4 = parse_string_literal(s4) # returns 'not a string literal'
在文件中,字符串值的表示方式与Python字符串文字非常相似;它们可以用'或'引用,并且可以包含反斜杠转义等。我可以用正则表达式滚动我自己的解析器,但是如果已经存在某些东西我宁愿不重新发明轮子。
我当然可以使用eval
,但这总是有些危险。
答案 0 :(得分:4)
......果然,我刚发布后就找到了答案。
甚至比我想要的更好ast.literal_eval
:ast — Abstract Syntax Trees
它可以评估任何仅由文字组成的Python表达式,这样可以确保安全。这也意味着我可以识别配置文件中可能是数字或字符串的项目,而无需尝试多次转换,然后回到ValueError
异常的下一次转换。我甚至不需要弄清楚该项目的类型。
它甚至比我需要的更灵活,如果我关心确保该项只是只是一个数字或一个字符串,这可能是一个问题,但我不这样做:
>>> ast.literal_eval('{"foo": [23.8, 170, (1, 2, 3)]}')
{'foo': [23.8, 170, (1, 2, 3)]}
答案 1 :(得分:2)
ast.literal_eval()
处理所有简单的Python文字和大多数复合文字。