ValueError: malformed node or string

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

2 Answers

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 can't 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 .


Use Case:

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.


Possible Fix to Error:

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.


NOTE:

  1. It is possible to crash the Python interpreter with a sufficiently large/complex string due to stack depth limitations in Python’s AST compiler.

  2. 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.

0

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

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like