В 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
?