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 .
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.
Notes:
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.
ast.literal_evaltakes a string and return the python evaluated object, here you alreart have the object which is a dict. It would work for the string'{"side": "BUY","key": "8234023409fa3242309sdfasdf903024917325"}'nulls in it. Fixed byast.literal_eval(my_str.replace("null", "None"))nullin the object, that’s probably JSON, and you should usejson.loadsinstead ofast.literal_eval.nullwithNoneis how “John Snully” turns into “John SNoney”.