ast.literal.eval
-
Безопасное вычисление узла выражения или строки в кодировке Unicode или Latin-1, содержащей выражение Python. Предоставленная строка или узел могут состоять только из следующих Python литеральных структур: строк, чисел, кортежей, списков, dicts, логических значений и None.
Вы не можете передать словарь в ast.literal_eval
. Он принимает только строковый ввод и преобразует его в соответствующий объект python. Вы не можете передавать списки / словари / кортежи и т.д. c в ast.literal_eval
.
Вариант использования -
Следующий фрагмент мог бы быть допустимым использованием этого метода -
import ast
# Converting a string representation of dictionary into dictionary.
webhook_data = ast.literal_eval('{"side": "BUY","key": "8234023409fa3242309sdfasdf903024917325"}')
print(webhook_data)
Вывод:
{'side': 'BUY', 'key': '8234023409fa3242309sdfasdf903024917325'}
Вы также можете использовать его, когда у вас есть список, кортеж, логические значения, числа, наборы et c в форме строки, и этот метод преобразует его в соответствующий объект python.
Возможное исправление ошибки -
У вас уже есть словарь, созданный с вами. Вы можете заставить свой код работать, выполнив следующее редактирование -
webhook_data = {"side": "BUY","key": "8234023409fa3242309sdfasdf903024917325"}
def parse_webhook(webhook_data):
"""
:param webhook_data: POST data from tradingview, as a string.
:return: Dictionary version of string.
"""
data = ast.literal_eval(str(webhook_data))
return data
Но приведенный выше код будет просто избыточным. Вы просто преобразуете словарь в строку, используя str()
, и эту преобразованную строку обратно в словарь, используя ast.literal_eval
.
ПРИМЕЧАНИЕ:
Можно взломать sh интерпретатор Python с достаточно большой / сложной строкой для ограничения глубины стека в компиляторе Python AST.
ast.literal_eval
вызывает исключение, если ввод не является допустимым типом данных Python, поэтому код не будет выполнен, если он нет.