python-decouple icon indicating copy to clipboard operation
python-decouple copied to clipboard

Casting to Python dictionaries

Open paduszyk opened this issue 9 months ago • 1 comments

This is another try on #35.

An interesting idea would be to add a helper for mapping-like env values like:

DATABASE_URLS="SQLite3=sqlite://:memory:,PostgreSQL=postgres://postgres:postgres@localhost:5432/postgres"

to return the respective Python dict objects. Implementation can be as simple as:

def parse_dict(value, *, item_sep=",", key_value_sep="="):
    def split_and_strip(value, sep):
        return list(map(str.strip, value.split(sep)))

    items = split_and_strip(value, item_sep)

    return dict(split_and_strip(item, key_value_sep) for item in items)

or a similar callable class.

Something similar is implemented in environs.

https://github.com/sloria/environs/blob/31d944845f52a3f6298f4b42cef92c2c887fe0a2/src/environs/init.py#L224-L250

but personally I prefer python-decouple as it natively supports .env file auto-reading.

paduszyk avatar Mar 25 '25 12:03 paduszyk

In the meantime, I found a workaround using Csv:

DATABASE_URLS = config(
    "DATABASE_URLS",
    cast=Csv(
        cast=functools.partial(str.split, sep="="),
        post_process=dict,
    ),
)

paduszyk avatar Apr 25 '25 14:04 paduszyk