【问题标题】:ValueError: malformed node or stringValueError:格式错误的节点或字符串
【发布时间】:2020-10-10 05:07:41
【问题描述】:

当我将以下格式的数据传递到“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'}

【问题讨论】:

  • 你想做什么? ast.literal_eval 接受一个字符串并返回 python 评估的对象,在这里你已经有了一个 dict 对象。它适用于字符串'{"side": "BUY","key": "8234023409fa3242309sdfasdf903024917325"}'
  • 查看我对类似问题的回答:stackoverflow.com/questions/15197673/…
  • 就我而言,我已经在传递一个字符串。问题是字符串中有一些nulls。由ast.literal_eval(my_str.replace("null", "None")) 修复

标签: python valueerror malformed


【解决方案1】:

ast.literal.eval -

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

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


用例 -

以下 sn-p 将是此方法的有效使用 -

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. ast.literal_eval 会在输入不是有效的 Python 数据类型时引发异常,因此如果不是,则不会执行代码。

【讨论】:

  • @bhristov 没问题 :) .
【解决方案2】:

ast.literal_eval() 需要一个字符串。使用str()webhook_data 转换为字符串即可。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-25
    • 2019-01-13
    • 2021-06-22
    • 2016-09-06
    • 1970-01-01
    • 2013-12-05
    • 2015-12-18
    • 2021-12-28
    相关资源
    最近更新 更多