ValueError: искаженный узел или строка - PullRequest
0 голосов
/ 20 июня 2020

Почему я получаю это сообщение об ошибке: ValueError: malformed node or string при передаче данных в указанном ниже формате в функцию "parse_webhook"?

Спасибо!

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(webhook_data)
    return data

ошибка Я получаю:

  File "C:\Users\User\anaconda3\lib\ast.py", line 55, in _convert_num
    raise ValueError('malformed node or string: ' + repr(node))

ValueError: malformed node or string: {'side': 'BUY', 'key': '8234023409fa3242309sdfasdf903024917325'}

Ответы [ 2 ]

1 голос
/ 20 июня 2020

ast.literal_eval() ожидает строку. Преобразуйте webhook_data в строку с str(), и он будет работать.

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)) # this fixes the issue
    return data
print(parse_webhook(webhook_data))

Вывод:

{'side': 'BUY', 'key': '8234023409fa3242309sdfasdf903024917325'}
1 голос
/ 20 июня 2020

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.


ПРИМЕЧАНИЕ:

  1. Можно взломать sh интерпретатор Python с достаточно большой / сложной строкой для ограничения глубины стека в компиляторе Python AST.

  2. ast.literal_eval вызывает исключение, если ввод не является допустимым типом данных Python, поэтому код не будет выполнен, если он нет.

...