Как я могу прочитать строки «ключ=значение», такие как ['foo=bar', 'a.b.c=ddd']
, и перевести их в словарь? Словарь следует либо обновить, если ключ уже существует, либо добавить новый ключ, если его нет.
Пример, приведенный в абзаце выше, следует перевести следующим образом...
{'foo': 'bar', 'a': {'b': {'c': 'ddd'}}}
Но вместо этого он переводится в этот неверный словарь...
{'foo': 'bar', 'a': {}, 'b': {}, 'c': 'ddd'}
Как исправить код в примере под комментарием «Установить значение основной конфигурации для текущей настройки»?
### For context - in reality I use an argument parser with two args.
### --config-file - Path to a YAML configuration file. If present,
### this file will be read into Python as a dictionary called
### `master_config`. If not, an empty dictionary of the same name
### will be created.
### --configs - Single 'key=value' settings that will be read into
### `master_config` and either override settings defined in the
### YAML configuration file, or set a value.
master_config = {'foo': 'baz'}
configs = ['foo=bar', 'a.b.c=ddd']
for config in configs:
# Split the setting into key and value.
k, v = config.split('=', 1)
# Split the key, if it's nested.
ks = k.split('.')
# Set the master config value for the current setting.
l = len(ks)
for i, x in enumerate(ks):
if i != l-1:
if not master_config.get(x):
master_config[x] = {}
else:
master_config[x] = v
print(master_config)
Вау, это просто смешно. Была одна проблема, которая была четко определена, и другие пользователи, очевидно, смогли понять вопрос, поскольку один из них любезно предоставил ответ в течение нескольких минут. Хотя для вас это может быть не важно, для других контекст жизненно важен, в противном случае предоставленные ответы могут быть недействительными. Отсутствие контекста также делает вопросы и ответы менее полезными для тех, кто ищет решения в будущем.
Работайте в обратном порядке, чтобы создать вложенный словарь, а затем обновите свой master_config
.
k = 'a'
v = 'ddd'
ks = k.split('.')[::-1]
master_config = {}
if len(ks) == 1:
master_config[k] = v
else:
nested_dict = {ks[0]: v}
for x in ks[1:]:
nested_dict = {x: nested_dict}
master_config.update(nested_dict)
Спасибо, этот код работает, как описано.
Мы не пишем здесь ответы, которые «нашли ошибку»; нам нужен конкретный вопрос, который станет результатом вашей лучшей попытки понять и найти конкретную проблему и продемонстрировать ее в минимально воспроизводимом примере. Если вы «боретесь» с одним разделом кода, мы должны просмотреть именно этот раздел с минимальной, но полной работой по настройке, которая позволит нам протестировать этот код напрямую, т. е. не встраивать его в какой-либо другой вложенный цикл после анализа аргументов и не зависит от файла, которого у нас нет.