Skip to main content

Load and access environment variables with type casting

Project description

cdotenv

A Python library for loading and accessing environment variables from .env files or StringIO with type casting. Licensed under GPL 3.

Installation

pip install cdotenv

Usage

Loading Environment Variables

The load function loads environment variables into os.environ from a .env file, a custom file path, or a StringIO object.

  • Default .env file:

    from cdotenv import load
    load()  # Loads from .env in current directory
    
  • Custom file path:

    from cdotenv import load
    from pathlib import Path
    load(Path("custom.env"))
    
  • StringIO:

    from cdotenv import load
    from io import StringIO
    load(StringIO("KEY=VALUE\n"))
    

The .env file should contain KEY=VALUE pairs, with comments (#) and empty lines ignored:

# Comment
KEY1=VALUE1
KEY2=VALUE2

Accessing Environment Variables with Type Casting

The Environ class allows type-hinted access to environment variables with automatic type conversion.

from cdotenv import Environ

class MyEnviron(Environ):
    DEBUG: bool
    DATABASE_URL: str
    TIMEOUT: int
    SEED: float

env = MyEnviron()
print(env.DEBUG)  # True if os.environ["DEBUG"] = "true"
print(env.DATABASE_URL)  # str, e.g., "postgresql://user:pass@localhost/db"
print(env.TIMEOUT)  # int, e.g., 30
print(env.SEED)  # float, e.g., 42.5
  • Raises ValueError if a variable is missing or cannot be converted to the specified type.
  • Raises AttributeError for undefined attributes.

Custom Type Conversion

Use the field decorator for custom conversion logic:

from cdotenv import Environ, field

class MyEnviron(Environ):
    LIST: list = field(lambda x: x.split(","))

env = MyEnviron()
print(env.LIST)  # ["a", "b", "c"] if os.environ["LIST"] = "a,b,c"
  • Raises ValueError if the converted value does not match the type hint.

Error Handling

  • Missing variable:

    class MyEnviron(Environ):
        MISSING: str
    env = MyEnviron()
    env.MISSING  # Raises ValueError: "Environment variable 'MISSING' not found"
    
  • Invalid type conversion:

    os.environ["INVALID"] = "not_an_int"
    class MyEnviron(Environ):
        INVALID: int
    env = MyEnviron()
    env.INVALID  # Raises ValueError: "Cannot convert 'not_an_int' to int"
    
  • Invalid return type:

    os.environ["WRONG_TYPE"] = "a,b,c"
    class MyEnviron(Environ):
        WRONG_TYPE: int = field(lambda x: x.split(","))
    env = MyEnviron()
    env.WRONG_TYPE  # Raises ValueError: "Expected type 'int' for 'WRONG_TYPE', but got 'list'"
    

Workflow

The following diagram illustrates the workflow for loading and accessing environment variables:

sequenceDiagram
    participant User
    participant cdotenv
    participant os.environ

    User->>cdotenv: load(arg)
    alt arg is None
        cdotenv->>cdotenv: Use Path(".env")
    else arg is Path
        cdotenv->>cdotenv: Open file
    else arg is StringIO
        cdotenv->>cdotenv: Read lines
    end
    cdotenv->>os.environ: _update_environ(lines)
    os.environ->>os.environ: Set KEY=VALUE pairs

    User->>cdotenv: Instantiate MyEnviron()
    User->>cdotenv: Access env.VARIABLE
    cdotenv->>cdotenv: Check type hints
    alt VARIABLE defined
        cdotenv->>os.environ: Get VARIABLE value
        alt Custom field
            cdotenv->>cdotenv: Apply custom conversion
        else
            cdotenv->>cdotenv: Apply type casting
        end
        cdotenv->>cdotenv: Validate type
        cdotenv-->>User: Return value
    else
        cdotenv-->>User: Raise AttributeError
    end
    alt VARIABLE missing
        cdotenv-->>User: Raise ValueError
    else Type conversion fails
        cdotenv-->>User: Raise ValueError
    end

License

This project is licensed under the GNU General Public License v3.0 (GPL 3).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cdotenv-0.1.1.tar.gz (42.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cdotenv-0.1.1-py3-none-any.whl (29.6 kB view details)

Uploaded Python 3

File details

Details for the file cdotenv-0.1.1.tar.gz.

File metadata

  • Download URL: cdotenv-0.1.1.tar.gz
  • Upload date:
  • Size: 42.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for cdotenv-0.1.1.tar.gz
Algorithm Hash digest
SHA256 a250c4f10792ab16d85709db6a1c1940bed112e29726761a1a9187d977f578b4
MD5 b0e8087256d7b67dbadca79a497476c3
BLAKE2b-256 798585e017ee6c9c7016b2abffe4e9577cfb14ff6422951e1fe2ec221be3e244

See more details on using hashes here.

File details

Details for the file cdotenv-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: cdotenv-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 29.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for cdotenv-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 da44f6074a2f99cc5a475c75219d989619ec1f5487b5e193f0027d92d5f8375d
MD5 0d6e47bdf89791c94eaa2db1a80a5a3d
BLAKE2b-256 74ad7f0c6267cb9e243364729c2451533819fc23f38488eff0c3f8508581c425

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page