gpt4 book ai didi

python - 假设 unicode_literals,如何安全地评估文字的表示?

转载 作者:太空宇宙 更新时间:2023-11-03 12:43:35 24 4
gpt4 key购买 nike

在 Python 2 中,我想评估一个包含文字表示的字符串。我想安全地执行此操作,所以我不想使用 eval()——相反,我已经习惯了使用 ast.literal_eval()的任务。

但是,我还想在纯引号中的字符串文字表示 unicode 对象的假设下进行评估——即您使用 from __future__ import unicode_literals 获得的那种向前兼容的行为。在下面的示例中,eval() 似乎尊重这种偏好,但 ast.literal_eval() 似乎没有。

from __future__ import unicode_literals, print_function

import ast

raw = r""" 'hello' """

value = eval(raw.strip())
print(repr(value))
# Prints:
# u'hello'

value = ast.literal_eval(raw.strip())
print(repr(value))
# Prints:
# 'hello'

请注意,我正在寻找一个通用的 literal_eval 替代品——我事先并不知道输出一定是一个字符串对象。我希望能够假设 raw 是任意 Python 文字的表示,它可以是一个字符串,也可以包含一个或多个字符串,也可以不包含。

有没有一种方法可以两全其美:一个函数既可以安全地评估任意 Python 文字的表示尊重 unicode_literals 偏好?

最佳答案

ast.literal_evalast.parse 都没有提供设置编译器标志的选项。您可以将适当的标志传递给 compile 以解析激活了 unicode_literals 的字符串,然后在结果节点上运行 ast.literal_eval:

import ast

# Not a future statement. This imports the __future__ module, and has no special
# effects beyond that.
import __future__

unparsed = '"blah"'
parsed = compile(unparsed,
'<string>',
'eval',
ast.PyCF_ONLY_AST | __future__.unicode_literals.compiler_flag)
value = ast.literal_eval(parsed)

关于python - 假设 unicode_literals,如何安全地评估文字的表示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54224792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com