编程语言
首页 > 编程语言> > python – 假设unicode_literals,如何安全地评估文字的表示?

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

作者:互联网

Python 2中,我想评估一个包含文字表示的字符串.我想安全地这样做,所以我不想使用eval() – 相反,我已经习惯使用ast.literal_eval()来完成这种任务.

但是,我还想假设普通引号中的字符串文字表示unicode对象,即.您从__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_eval和ast.parse都不提供设置编译器标志的选项.您可以传递适当的标志进行编译以解析激活了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,python-2-x,eval
来源: https://codeday.me/bug/20190722/1499885.html