Reputation: 293
Why do I get this error message: ValueError: malformed node or string
when I pass data in the below format into the "parse_webhook" function?
Thanks!
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
Wrror I get:
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'}
Upvotes: 25
Views: 132230
Reputation: 2793
If the above solutions don't work for you, try using json.loads
instead of ast.literal_eval
, example:
import json
webhook_data = {"side": "BUY","key": "8234023409fa3242309sdfasdf903024917325"}
content = json.loads(webhook_data)
Upvotes: 1
Reputation: 5786
ast.literal_eval
:Safely evaluate an expression node or a Unicode or Latin-1 encoded string containing a Python expression. The string or node provided may only consist of the following Python literal structures: strings, numbers, tuples, lists, dicts, booleans, and None.
You cannot pass a dictionary to ast.literal_eval
. It only takes a string input and converts it into appropriate python object. You can't pass lists / dictionary / tuples, etc to the ast.literal_eval
.
The following snippet would have been a valid use of this method
import ast
# Converting a string representation of dictionary into dictionary.
webhook_data = ast.literal_eval('{"side": "BUY","key": "8234023409fa3242309sdfasdf903024917325"}')
print(webhook_data)
Output:
{'side': 'BUY', 'key': '8234023409fa3242309sdfasdf903024917325'}
You could also use it when you have a list, tuple, booleans, numbers, sets etc in form of string and this method would evaluate it into appropriate python object.
You already have a dictionary constructed with you. You could make your code work by doing the following edit:
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
But the above code would just be redundant. You are just converting a dictionary to string using str()
and that converted string back into dictionary using a ast.literal_eval
.
It is possible to crash the Python interpreter with a sufficiently large/complex string due to stack depth limitations in Python’s AST compiler.
ast.literal_eval
raises an exception if the input isn't a valid Python datatype, so the code won't be executed if it's not.
Upvotes: 24
Reputation: 3197
ast.literal_eval()
expects a string. Convert webhook_data
to string with str()
and it will work.
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))
Output:
{'side': 'BUY', 'key': '8234023409fa3242309sdfasdf903024917325'}
Upvotes: 7