Python. Умолчательные значения настроек

Если в программе есть настройки, хорошо предусмотреть для них умолчательные значения. Так всё будет работать «из коробки», а в конфиг полезут только те, кому это действительно надо.

Допустим, настройки по умолчанию мы сложили в словарь:

DEFAULTS = {
  "name": "Frank",
  "species": "pigeon",
  "age": 42,
}

А пользовательские настройки лежат в settings.ini. Их можно считать функцией load_settings(), которая тоже возвращает словарь.

Вопрос: как получить актуальное значение того или иного свойства?

Так себе способ:

custom = load_settings()

def get_setting_value(name):
  if name in custom:
    return custom[name]
  else:
    return DEFAULTS[name]

Способ лучше — воспользоваться collections.ChainMap:

from collections import ChainMap

# пусть custom ==
# { "species": "human" }
custom = load_settings()
settings = ChainMap(custom, DEFAULTS)

def get_setting_value(name):
  return settings[name]

get_setting_value("name")
'Frank'

get_setting_value("species")
'human'

В ChainMap можно запихать сколько угодно словарей, поиск по ним производится последовательно. Присваивание тоже работает:

settings["age"] = 33

custom
{'species': 'human', 'age': 33}

DEFAULTS
{'name': 'Frank', 'species': 'pigeon', 'age': 42}

Заметка из телеграм-канала «Oh My Py»