ValueError:格式错误的节点或字符串

问题描述 投票:0回答:3

当我将以下格式的数据传递到“parse_webhook”函数时,为什么会收到此错误消息:

ValueError: malformed node or string

谢谢!

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'}
python valueerror malformed
3个回答
17
投票

ast.literal.eval

安全地评估表达式节点或 Unicode 或 Latin-1 编码 包含 Python 表达式的字符串。提供的字符串或节点可以 仅包含以下 Python 文字结构:字符串、 数字、元组、列表、字典、布尔值和无。

您无法将字典传递给

ast.literal_eval
。它只需要一个字符串输入并将其转换为适当的 python 对象。您不能将列表/字典/元组等传递给
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'}

当您有字符串形式的列表、元组、布尔值、数字、集合等时,您也可以使用它,并且此方法会将其评估为适当的 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. 由于 Python AST 编译器中的堆栈深度限制,使用足够大/复杂的字符串可能会导致 Python 解释器崩溃。

  2. 如果输入不是有效的 Python 数据类型,
  3. ast.literal_eval
    会引发异常,因此如果不是有效的代码将不会执行。


4
投票

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'}

0
投票

使用ast模块,示例:

ast.literal_eval(str_convert)

© www.soinside.com 2019 - 2024. All rights reserved.