为什么我会收到此错误消息:
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'}
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
将字符串转换回字典。
注意:
由于 Python 的 AST 编译器中的堆栈深度限制,使用足够大/复杂的字符串可能会使 Python 解释器崩溃。
ast.literal_eval
如果输入不是有效的 Python 数据类型,则引发异常,因此如果不是,则不会执行代码。
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'}