Skip to content

Use traitlets for our configuration. #16476

@nstarman

Description

@nstarman

What is the problem this feature will solve?

We currently bundle configobj with Astropy and use it to do our configuration. It's old, not well supported / actively developed, and doesn't do nice things like load configurations from JSON files.

Describe the desired outcome

We replace configobj with traitlets, which is the IPython and Jupyter configuration system (but that depends on neither). It's stable, well-supported, actively developed, supports a lot of modern conveniences, and has 0 dependencies.

Additional context

See the Design Requirements!
I wish our config system supported this.

Here are the main requirements we wanted our configuration system to have:

  • Support for hierarchical configuration information.

  • Full integration with command line option parsers. Often, you want to read
    a configuration file, but then override some of the values with command line
    options. Our configuration system automates this process and allows each
    command line option to be linked to a particular attribute in the
    configuration hierarchy that it will override.

  • Configuration files that are themselves valid Python code. This accomplishes
    many things. First, it becomes possible to put logic in your configuration
    files that sets attributes based on your operating system, network setup,
    Python version, etc. Second, Python has a super simple syntax for accessing
    hierarchical data structures, namely regular attribute access
    (Foo.Bar.Bam.name). Third, using Python makes it easy for users to
    import configuration attributes from one configuration file to another.
    Fourth, even though Python is dynamically typed, it does have types that can
    be checked at runtime. Thus, a 1 in a config file is the integer '1',
    while a '1' is a string.

  • A fully automated method for getting the configuration information to the
    classes that need it at runtime. Writing code that walks a configuration
    hierarchy to extract a particular attribute is painful. When you have
    complex configuration information with hundreds of attributes, this makes
    you want to cry.

  • Type checking and validation that doesn't require the entire configuration
    hierarchy to be specified statically before runtime. Python is a very
    dynamic language and you don't always know everything that needs to be
    configured when a program starts.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Feature RequestRefactoringconfigexternalPRs and issues related to external packages vendored with Astropy (astropy.extern)

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions