使用Python的ast.literal_eval时是否推荐始终采用原始字符串?
要不要始终用原始字符串处理ast.literal_eval?
没必要始终用原始字符串,得看具体场景:
- 要是你处理的字符串带Python不认的转义序列(比如示例里的
\S),或者需要原样保留反斜杠,那用原始字符串包裹是必要的。这时候普通字符串会触发语法警告,甚至可能把转义序列解析错——比如要是输入\n,普通字符串会把它变成换行符,原始字符串则会保留\n两个字符。 - 要是你的输入本身是合法的Python转义(比如
\n、\t),而且你希望ast.literal_eval把这些转义解析成对应的字符,这时候就不能用原始字符串。比如你输入testinput = "\\n",用普通字符串方式处理会得到换行符,用原始字符串的话就只会得到\n,这就不符合需求了。 - 安全性上,两种方式在ast.literal_eval里都安全——毕竟ast.literal_eval只会解析合法的Python字面量,不会执行代码。两者的区别只是对转义序列的处理逻辑,不存在谁更安全的说法。
总结:别盲目全用原始字符串,先搞清楚你是要保留原始转义字符,还是要让解析器处理转义,再选对应的方式。
内容的提问来源于stack exchange,提问作者Berthold Gehrke
相关产品推荐
相关产品推荐

