#python #fb-hydra
#python #fb-hydra
Вопрос:
Допустим, у меня есть абстрактный класс db
в моем коде и классы db1
, db1
, … db1
, которые наследуются от db
. Мой проект использует hydra и имеет такую структуру:
├── my_app.py
├── conf.yaml
└── db
├── db1.yaml
├── db2.yaml
└── db3.yaml
Мне нужен список db
, поэтому я хотел бы получить окончательный конфигурационный файл, подобный этому :
db:
-
param1_of_db1: key_1_1
param2_of_db1: key_1_2
-
param1_of_db2: key_2_1
param2_of_db2: key_2_2
-
param1_of_db3: key_3_1
param2_of_db3: key_3_2
итак, db
это список параметров db1
, db2
, db3
.
В conf.yaml
файле я представляю что-то вроде:
defaults:
- db: [db1, db2, db3]
Есть ли способ сделать что-то подобное?
Ответ №1:
То, что вы запрашиваете, не поддерживается Hydra.
- Состав списка не поддерживается, списки все или ничего во время составления.
- Группы конфигурации являются взаимоисключающими, есть запрос функции, чтобы ослабить это.
Вы можете приблизиться к нему, хотя (не имея возможности переопределить структуру из командной строки, это что-то вроде: config.yaml:
defaults:
- db/db1
- db/db2
- db/db3
Этот синтаксис задокументирован здесь .
В каждом конфигурационном файле БД вы можете сделать что-то вроде:
db /db1.yaml:
# @pacakge _group_._name_
host: localhost
port: 3306
Переопределения пакетов задокументированы здесь .
Результирующая конфигурация будет выглядеть следующим образом:
db: # from the config group of the corresponding config (path)
db1: # from the name of the corresponding config
host: localhost
port: 3306
db2:
...
Комментарии:
1. Спасибо, Омри, это действительно полезно!
2. кстати, планируете ли вы включить состав списка в следующую версию Hydra?
3. Никаких планов, в 99% случаев лучше всего заменить список вторым списком при слиянии.
Ответ №2:
Вы можете приблизиться к слиянию списков с последней версией hydra / omegaconf
Хитрость в том, что словари составлены, поэтому вы можете составить конфигурацию в словаре, а затем использовать новую oc.dict.values
интерполяцию для получения окончательного списка.
Итак, в вашем случае это будет что-то вроде:
defaults:
- dbs/db1
- dbs/db2
- dbs/db3
db: ${oc.dict.values:dbs}
Обратите внимание, что я переименовал пакет «db» в «dbs». Таким образом, окончательный разрешенный конфиг будет выглядеть так:
dbs:
db1:
host: localhost
port: 3306
db2:
host: localhost
port: 3307
db3:
host: localhost
port: 3308
db:
- host: localhost
port: 3306
- host: localhost
port: 3307
- host: localhost
port: 3308
Ключи для пакета «dbs» ни для чего не используются, но я нахожу, что это на самом деле делает конфигурацию более понятной для их использования.