Почему ast.literal_eval () по-разному оценивает эти два словаря? - PullRequest
0 голосов
/ 10 июля 2020

У меня вопрос, почему словарь «a», который был создан корректным образом, отличается от словаря «b».

В следующем коде вы видите простой словарь «a», который Я хочу проверить с помощью

a = ast.literal_eval (a)

Любопытно, что «a» не похоже на словарь или что-то вроде python синтаксис считается допустимым, поскольку ast.literal_eval (a) вызывает исключение:

сбойный: неверный узел или строка: {':': 5}

Операция словаря a.keys () возвращает ':', как и ожидалось.

Более любопытно, когда «преобразовывает» исходный словарь с помощью

b = str (a)

словарь b фактически оценивается как словарь во втором операторе try.

import ast

a = {}
a[":"] = 5

b = str(a)

print(a)
print(b)

try:
    a = ast.literal_eval(a)
    print(type(a))
except Exception as e:
    print(f'a failed: {e}')

try:
    b = ast.literal_eval(b)
    print(type(b))
except Exception as e:
    print(f'b failed: {e}')

вывод:

{':': 5}
{':': 5}
a failed: malformed node or string: {':': 5}
<class 'dict'>

1 Ответ

0 голосов
/ 10 июля 2020

ast.literal_eval работает со строками или узлами AST, а не со словарями.

Из документация :

ast.literal_eval(node_or_string)

Безопасно вычисляйте узел выражения или строку , содержащую Python литерал или отображение контейнера.

Итак, словарь a действительно является «неверно сформированным узлом или строкой», потому что это ни одно из них.

Когда вы говорите « словарь b фактически оценивается как словарь во втором операторе try» , это не совсем правильно, потому что b = str(a) делает b a string . Таким образом, b - это строковое представление словаря, поэтому оно работает должным образом.

...