Этот вопрос довольно конкретный c, Я успешно выполнил «хочу», но он очень специфичен c для моего варианта использования и, вероятно, некрасиво для Python эксперта, поэтому мне любопытно, может ли он быть более общим c и / или умно.
Мне нужно отредактировать маршрутизацию prometheus alertmanager, хранящуюся в файле yml ( документация здесь )
В моем случае моя маршрутизация (извлечение):
route:
routes:
- match:
product: my_product
stage: prod
routes:
- continue: true
match_re:
severity: (info|warning|critical)
receiver: mattermost
- continue: true
match_re:
severity: (warning|critical)
receiver: mail_infra
- match:
severity: critical
receiver: sms_voidandnany
Мне нужно отредактировать получатель «sms_voidandnany» (получатель зависит от календаря Google).
Вот мой первый черновик:
with open('alertmanager.yml') as f:
data = yaml.safe_load(f)
routes=data['route']['routes']
for item in routes:
if item.get('match').get('product') == 'my_product' and item.get('match').get('stage') == 'prod':
for subitem in item.get('routes'):
if 'match' in subitem:
if subitem.get('match').get('severity') == 'critical':
subitem['receiver'] = 'sms_another_user'
with open("alertmanager2.yaml", "w") as f:
yaml.dump(data, f)
3 if
с, 2 цикла, даже я, а не python эксперт и не разработчик, работающий на полную ставку. Я думаю, что это некрасиво.
Видите ли вы лучший способ, больше Pythonisti c способ достичь этого?
Вишенка на торте, как вы думаете, есть ли «простой» способ сделать замену generi c? Структура маршрутизации - динамический c, мы можем сделать маршрутизацию - сопоставление - маршрутизацию - сопоставление и так далее ... Рекурсивная функция?