The Defaults List
Introductionβ
Many of the features described in this page are new. Please report any issues.
The Defaults List is a list in an input config that instructs Hydra how to build the output config. Each input config can have a Defaults List as a top level element. The Defaults List itself is not a part of output config.
defaults:
 (- CONFIG|GROUP_DEFAULT)*
CONFIG                 : (CONFIG_GROUP/)?CONFIG_NAME(@PACKAGE)?
GROUP_DEFAULT          : [optional|override]? CONFIG_GROUP(@PACKAGE)?: OPTION
OPTION                 : CONFIG_NAME|CONFIG_NAMES|null
CONFIG : A config to use when creating the output config. e.g. db/mysql, db/mysql@backup.
GROUP_DEFAULT : An overridable config. e.g. db: mysql, db@backup: mysql.
- override : Overrides the option of a previously defined GROUP_DEFAULT.
 - optional : By default, an OPTION that do not exist causes an error; optional suppresses the error.
 - null : A place-holder for a future override. If it is not overridden the entry is ignored.
 
CONFIG_NAME: The name of a config, without the file system extension. e.g. mysql and not mysql.yaml.
CONFIG_NAMES : A list of config names. e.g. [mysql, sqlite]
CONFIG_GROUP : A path to a set of configs.
The path is relative to the containing config.
It can be made absolute by prefixing it with a /.
The path separator is / regardless of the operating system.
OPTION: The currently selected CONFIG_NAME or CONFIG_NAMES from a CONFIG_GROUP.
PACKAGE : Where to place the content of the config within the output config. It is relative to the Package of the containing config by default. See Packages.
An exampleβ
βββ server
β   βββ db
β   β   βββ mysql.yaml
β   β   βββ sqlite.yaml
β   βββ apache.yaml
βββ config.yaml
Input configs:
defaults:
  - server/apache
debug: false
defaults:
  - db: mysql
name: apache
name: mysql
name: sqlite
Output config:
server:
  db:
    name: mysql
  name: apache
debug: false
Overriding Config Group optionsβ
A Config Group's option can be overridden using a new GROUP_DEFAULT with the override keyword. If a Group Default is overridden more than once, the last one, in depth first order, wins.
Extending the previous example:
defaults:
  - server/apache
  - override server/db: sqlite
debug: false
server:
  db:
    name: sqlite
  name: apache
debug: false
A Config Group's option can also be overridden via the command line. e.g:
$ python my_app.py server/db=sqlite
Composition orderβ
The Defaults List is ordered:
- If multiple configs define the same value, the last one wins.
 - If multiple configs contribute to the same dictionary, the result is the combined dictionary.
 
By default, the content of a config is overriding the content of configs in the defaults list.
defaults:
  - db: mysql
db:
  host: backup
db:
  driver: mysql    # db/mysql.yaml
  host: backup     # config.yaml
  port: 3306       # db/mysql.yaml
The _self_ entry determines the relative position of this config in the Defaults List.
If it is not specified, it is added automatically as the last item.
defaults:
  - _self_
  - db: mysql # Overrides this config
db:
  host: backup
db:
  driver: mysql    # db/mysql.yaml
  host: localhost  # db/mysql.yaml
  port: 3306       # db/mysql.yaml
With _self_ at the top of the Defaults List, the host field defined in config.yaml now precedes the host field defined
in db/mysql.yaml, and as a result is overridden.
Interpolation in the Defaults Listβ
Config Group Options can be selected using interpolation.
defaults:
  - server: apache
  - db: mysql
  - combination_specific_config: ${server}_${db}  # apache_mysql
Interpolation keys can be config groups with any @package overrides.
For example: ${db/engine}, ${db@backup}
The selected option for combination_specific_config depends on the final selected options for db and server. e.g., If db is overridden to sqlite, combination_specific_config will become apache_sqlite.
Restrictions:β
- Interpolation keys in the Defaults List cannot reference values in the Final Config Object (it does not yet exist).
 - Defaults List interpolation keys are absolute (even in nested configs).
 - The subtree expanded by an Interpolated Config may not contain Default List overrides.
 
See Patterns/Specializing Configs for more information.
Debugging the Defaults Listβ
Hydra's config composition process is as follows:
- The Defaults Tree is created.
 - The Final Defaults List is created via a DFS walk of the Defaults Tree.
 - The Output Config is composed from the entries in the Final Defaults List.
 
You can inspect these artifacts via command line flags:
--info defaults-treeshows the Defaults Tree.--info defaultsShows the Final Defaults List.--cfg job|hydra|allShows the Output Config.
Example outputs:
python my_app.py --info defaults-tree
<root>:
  hydra/config:
    hydra/hydra_logging: default
    hydra/job_logging: default
    hydra/launcher: basic
    hydra/sweeper: basic
    hydra/output: default
    hydra/help: default
    hydra/hydra_help: default
    _self_
  config:
    server/apache:
      server/db: mysql
      _self_
    _self_
python my_app.py --info defaults
Defaults List
*************
| Config path                 | Package             | _self_ | Parent        |
-------------------------------------------------------------------------------
| hydra/hydra_logging/default | hydra.hydra_logging | False  | hydra/config  |
| hydra/job_logging/default   | hydra.job_logging   | False  | hydra/config  |
| hydra/launcher/basic        | hydra.launcher      | False  | hydra/config  |
| hydra/sweeper/basic         | hydra.sweeper       | False  | hydra/config  |
| hydra/output/default        | hydra               | False  | hydra/config  |
| hydra/help/default          | hydra.help          | False  | hydra/config  |
| hydra/hydra_help/default    | hydra.hydra_help    | False  | hydra/config  |
| hydra/config                | hydra               | True   | <root>        |
| server/db/mysql             | server.db           | False  | server/apache |
| server/apache               | server              | True   | config        |
| config                      |                     | True   | <root>        |
-------------------------------------------------------------------------------
python my_app.py --cfg job
server:
  db:
    name: mysql
  name: apache
debug: false