JetBaget
@JetBaget
Программист Python

Можно ли реализовать запись в словарь по адресу в строковом формате в Python 3?

Всем привет! Есть следующая задача: осуществить запись данных в словарь по определенному адресу, заданному в формате строки. Приведу пример. Имеются следующие данные:
adress = "['data'][0]['format']"
my_dict = {'data': [{'format': 'txt', 'size': 1024}, {'format': 'doc, 'size' : 2048}]}

Допустим, мне нужно по адресу "adress" поменять значение на 'doc'. Как я понял, функции eval и exec позволяют преобразовать строки в программный код и выполнить его. Но как добиться этого:
my_dict['data'][0]['format'] = 'doc'
не могу сообразить...
Такие операции мне нужно выполнять в цикле, где адреса вытаскиваются из diff'a, полученного с помощью DeepDiff
  • Вопрос задан
  • 247 просмотров
Решения вопроса 1
У вас есть контроль над форматом строки адреса? Например, сделать её так:

data.0.format

Было бы проще. Теперь по поводу самого парсинга. Вы можете написать две функции.

def parse_path(address):
    # парсим адрес address и возвращаем список его фрагментов.
    # пример: "['data'][0]['format']" -> ['data', 0, 'format']
    # Думаю, что регулярные выражения вкупе с небольшой обвязкой могут помочь.
    return path

def recursive_set(datastructure, path, value):
    head, tail = path[0], path[1:]
    if tail:
        # есть ещё что делать дальше.
        return recursive_set(datastructure[head], tail, value)
    else:
        # Дальше ползти некуда, завершаем рекурсию.
        datastructure[head] = value

recursive_set(
    {'data': ...},
    parse_address("['data'][0]['format']"),
    'doc'
)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@dmtrrr
Backend developer
Ты используешь неправильную терминологию и здесь не нужен eval. Все что нужно сделать это распарсить строку "['data'][0]['format']".
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы