Для моего приложения Python мне нужно создать анализатор файла конфигурации, который сможет анализировать несколько версий файла конфигурации.
Целью является создание анализатора конфигурации, который будет безопасен независимо от версии файла конфигурации.
Возьмите следующий пример: сегодня я отправляю свое программное обеспечение и определенный файл конфигурации моему клиенту. Завтра я выпущу новую версию программного обеспечения. Как я могу гарантировать его совместимость с файлом конфигурации, отправленным сегодня? А для следующих версий программного обеспечения?
Вот пример: скажем, у меня есть файл конфигурации config_1.yaml
:
version: 1
digits:
- one
- two
- three
Я хочу, чтобы мой Python читал:
{'digits': ['one', 'two', 'three'], 'version': 1}
Затем, через некоторое время, я обновляю свои файлы конфигурации в формате config_2.yaml
:
version: 2
digits:
- one
- two
- three
colors:
red: #FF0000
green: #00FF00
blue: #0000FF
Я хочу, чтобы мое программное обеспечение считывало эту конфигурацию как:
{'colors': {'blue': '#0000FF', 'green': '#00FF00', 'red': '#FF0000'},
'digits': ['one', 'two', 'three'],
'version': 2}
Но Мне также нужна эта версия программного обеспечения, чтобы иметь возможность читать config_1.yaml
как:
{'colors': [], 'digits': ['one', 'two', 'three'], 'version': 1}
И так далее: когда выйдет третья версия программного обеспечения, я хочу, чтобы она могла читать и читать config_3.yaml
:
version: 3
digits:
- one
- two
- three
colors:
red: '#FF0000'
green: '#00FF00'
blue: '#0000FF'
constants:
pi: 3.1415
e: 2.71828
Как:
{'colors': {'blue': '#0000FF', 'green': '#00FF00', 'red': '#FF0000'},
'constants': {'e': 2.71828, 'pi': 3.1415},
'digits': ['one', 'two', 'three'],
'version': 3}
А для config_1.yaml
и config_2.yaml
соответственно:
{'colors': [], 'constants': {}, 'digits': ['one', 'two', 'three'], 'version': 1}
{'colors': {'blue': '#0000FF', 'green': '#00FF00', 'red': '#FF0000'},
'constants': {},
'digits': ['one', 'two', 'three'],
'version': 2}
Я написал следующий код для получения этих результатов:
import yaml
from pprint import pprint
def read_yaml(f_path):
with open(f_path, 'r', encoding='utf-8') as fid:
config = yaml.load(fid, Loader=yaml.FullLoader)
return config
def read_config_1(config):
pass
def read_config_2(config):
if config['version'] < 2:
read_config_1(config)
# the "colors" part of the config was added between versions 1 and 2
config['colors'] = []
def read_config_3(config):
if config['version'] < 3:
read_config_2(config)
# the "constants" part of the config was added between versions 2 and 3
config['constants'] = {}
def read_config_file(f_path):
config = read_yaml(f_path)
read_config_3(config)
return config
if __name__ == '__main__':
for f_name in [f'config_{i}.yaml' for i in range(1, 4)]:
print('-'*20 + ' ' + f_name + ' ' + '-'*20)
config = read_config_file(f_name)
pprint(config)
print()
Есть ли у кого-нибудь комментарии к этому коду или какие-либо советы о том, насколько (более) эффективным он может быть?