Skip to main content

Envarify

Environment variables parsing and validation using python type hints

Usage

Having some environment variables:

export TIMEOUT_S=2.5
export API_KEY=some_key
export ALLOWED_IDS=1,2,3
export ENABLE_FEATURE=true

We can create a config object in Python:

from envarify import BaseConfig, EnvVar, SecretString

class MyConfig(BaseConfig):
    timeout_s: float = EnvVar("TIMEOUT_S")
    api_key: SecretString = EnvVar("API_KEY")
    allowed_ids: set[int] = EnvVar("ALLOWED_IDS")
    enable_feature: bool = EnvVar("ENABLE_FEATURE", default=False)
    optional_arg: str | None = EnvVar("OPTIONAL_ARG", default=None)

config = MyConfig.fromenv()
print(config)
#> MyConfig(timeout_s=2.5, api_key='******', allowed_ids={1,2,3}, enable_feature=True, optional_arg=None)

Missing environment variables

If there are required environment variables not set, they will be grouped into one error e.g.:

config = MyConfig.fromenv()
#> MissingEnvVarsError: TIMEOUT_S, API_KEY, ALLOWED_IDS

Supported Types

  • Built-in/standard library types

    • int
    • float
    • bool
    • str
    • typing.StrEnum
    • datetime.date
    • datetime.datetime
  • Special types

    • SecretString

      Masks sensitive environment variables by displaying ****** when printed or logged. The actual value is accessible via the reveal() method, and memory is cleared when object is no longer needed.

      from envarify import BaseConfig, EnvVar, SecretString
      
      class MyConfig(BaseConfig):
          api_key: SecretString = EnvVar("API_KEY")
      
      config = MyConfig.fromenv()
      print(config.api_key)
      
      #> MyConfig(api_key='******')
      
    • Url

      Validates that string is a URL.

      from envarify import BaseConfig, EnvVar, Url
      
      class MyConfig(BaseConfig):
          url: Url = EnvVar("ws://example.com")
      
      config = MyConfig.fromenv()
      print(config.api_key)
      
      #> MyConfig(url='ws://example.com')
      
    • HttpUrl

      Same as Url but validates for http protocol

    • HttpsUrl

      Same as Url but validates for https protocol

    • AnyHttpUrl

      Same as Url but validates for either http or https protocol

  • Dictionary

    • dict / typing.Dict type reads environmental variable as JSON
  • Sequences (delimiter separated values)

    • list[T] / typing.List[T]

    • set[T] / typing.Set[T]

    • tuple[T] / typing.Tuple[T]

      where T is any primitive type

  • BaseConfig subtype itself

    With environment variables COMPONENT_TIMEOUT=5 and OTHER=dummy you can do:

    from envarify import BaseConfig, EnvVar
    
    class ComponentConfig(BaseConfig):
        timeout: int = EnvVar("COMPONENT_TIMEOUT")
    
    class ApplicationConfig(BaseConfig):
        component: ComponentConfig
        other: str = EnvVar("OTHER")
    
    config = ApplicationConfig.fromenv()
    print(config)
    #> ApplicationConfig(component=ComponentConfig(timeout=5), other='dummy')
    

Testing

In tests for your application you don't have to worry about mocking the environment variables. Instead just create a mock config object:

mock_config = MyConfig(timeout_s=4.2, api_key="dummy", allowed_ids={1,2,3}, enable_feature=True)

Download files

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

Source Distribution

envarify-1.5.1.tar.gz (14.5 kB view details)

Uploaded Source

Built Distribution

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

envarify-1.5.1-py3-none-any.whl (10.7 kB view details)

Uploaded Python 3

File details

Details for the file envarify-1.5.1.tar.gz.

File metadata

  • Download URL: envarify-1.5.1.tar.gz
  • Upload date:
  • Size: 14.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.7

File hashes

Hashes for envarify-1.5.1.tar.gz
Algorithm Hash digest
SHA256 ecaa3fe3b606368ce626b311d954eb7476dfe93ab9c6b8b7d79838521887c2d6
MD5 cdc72c978e8c4aa27608232bfc6f97a3
BLAKE2b-256 86d1183b8dfe444efd009b67e1ff751c38f9abc8665012ffb72c01b8c60ae0e1

See more details on using hashes here.

File details

Details for the file envarify-1.5.1-py3-none-any.whl.

File metadata

  • Download URL: envarify-1.5.1-py3-none-any.whl
  • Upload date:
  • Size: 10.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.7

File hashes

Hashes for envarify-1.5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 846086fcbf92d2c9fc8d7c51093a0989854b1e39009357d7fab95a15e9f74c48
MD5 d228d64d1234c7f04f153731d2ee4aaa
BLAKE2b-256 7c7b1ca134202cbddbd386e92fa09e581e706d1bf1f60d34f5b55fad5d7b30b5

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.5.1 This release

2 files

1.5.0

2 files

1.4.2

2 files

1.4.1

2 files

1.4.0

2 files

1.3.0

2 files

1.2.0

2 files

1.1.3

2 files

1.1.2

2 files

1.1.1

2 files

1.1.0

2 files

1.0.0

2 files

0.0.3

2 files

0.0.2

2 files

0.0.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page