Нужно преобразовать словарь в виде строки в обычный словарь
Код:
foo_text_dict = "message='21', fwd_from=None, via_bot_id=None, reply_to=None, media=None, reply_markup=None, entities=[], views=None, forwards=None, replies=None"
print(dict(foo_text_dict))
Ошибка:
Traceback (most recent call last):
File "some_path\test.py", line 4, in <module>
print(dict(foo_text_dict))
ValueError: dictionary update sequence element #0 has length 1; 2 is required
Требуется получить на выходе обычный словарь python
Ответы (2 шт):
Автор решения: passant
→ Ссылка
Если я правильно понял условие, то вот примерно как-то так:
foo_text_dict = "message='21', fwd_from=None, via_bot_id=None, reply_to=None, media=None, reply_markup=None, entities=[], views=None, forwards=None, replies=None"
list_text_dict=dict()
for et in foo_text_dict.split(", "):
list_text_dict.update(dict([et.split("=")]))
print(list_text_dict)
Результат:
{'message': "'21'", 'fwd_from': 'None', 'via_bot_id': 'None', 'reply_to': 'None', 'media': 'None', 'reply_markup': 'None', 'entities': '[]', 'views': 'None', 'forwards': 'None', 'replies': 'None'}
Автор решения: GrAnd
→ Ссылка
Если нужно получить прямо таки словарь со всеми типами, а не просто строками, то можно воспользоваться ast. Т.к. исходная строка уж очень напоминает аргументы функции, напишем функцию-враппер, которая принимает эти аргументы и возвращает словарь из них.
import ast
def get_dict_from_str(dict_str):
# это наша программа, которая определяет функции враппера
program = f"""
def convert_to_dict():
# враппер
def params_to_dict(**kwargs):
return kwargs
# захардкодим переданную строку с аргументами в вызов враппера
return params_to_dict({dict_str})
"""
# компилируем всё это
tree = ast.parse(program, mode='exec')
code = compile(tree, filename='some', mode='exec')
namespace = {}
exec(code, namespace)
# вызываем функцию из скомпилированного кода
return namespace["convert_to_dict"]()
Можно обойтись и без ast. Хотя это считается менее безопасным.
def get_dict_from_str(dict_str):
def params_to_dict(**kwargs):
return kwargs
namespace = {}
exec(f"result = params_to_dict({dict_str})", locals(), namespace)
return namespace["result"]
Ну ли даже без враппера, т.к. dict() тоже умеет собирать словарь из аргументов.
def get_dict_from_str(dict_str):
namespace = {}
exec(f"result = dict({dict_str})", locals(), namespace)
return namespace["result"]
Во всех случаях исполнив это:
foo_text_dict = "message='21', fwd_from=None, via_bot_id=None, reply_to=None, media=None, reply_markup=None, entities=[], views=None, forwards=None, replies=None"
print(get_dict_from_str(foo_text_dict))
Получим:
{'message': '21', 'fwd_from': None, 'via_bot_id': None, 'reply_to': None, 'media': None, 'reply_markup': None, 'entities': [], 'views': None, 'forwards': None, 'replies': None}