Как собрать конфигурационные файлы в список с помощью Hydra-fb?

#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.

  1. Состав списка не поддерживается, списки все или ничего во время составления.
  2. Группы конфигурации являются взаимоисключающими, есть запрос функции, чтобы ослабить это.

Вы можете приблизиться к нему, хотя (не имея возможности переопределить структуру из командной строки, это что-то вроде: 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» ни для чего не используются, но я нахожу, что это на самом деле делает конфигурацию более понятной для их использования.