Skip to main content

Make use of environment variables for configuration easy

Project description

simple-env-config

Build Status

This Python library, which works with Python 3.6 and above, tries to make reading configuration values from the environment easy, such that you can replace code like

import os

PORT = int(os.getenv("PORT", 8080))
K8S_NAMESPACE = os.environ["K8S_NAMESPACE"]  # required, no default value
DEBUG_MODE = os.getenv("DEBUG_MODE", "0").lower() in ("1", "true", "yes", "on")

run_app(PORT, K8S_NAMESPACE, DEBUG_MODE)

by

from simple_env_config import env_config

@env_config
class Config:
    port: int = 8080
    k8s_namespace: str
    debug_mode: bool = False

run_app(Config.port, Config.k8s_namespace, Config.debug_mode)

Note that this example uses lower case variable names in class Config. These will be converted to upper case for the environment variable lookup, i.e., the values will be read from the environment variables PORT, K8S_NAMESPACE, and DEBUG_MODE, respectively.

This behavior can be changed: decorating the class with

@env_config(upper_case_variable_names=False)

will cause a case-sensitive variable lookup in the environment.

Motivation

As shown in the example above, parsing many environment variables without helper functions or libraries requires quite a bit code that is not only repetitive, but sometimes even confusing and error prone.

This library makes this task easier. In contrast to alternatives like environs and environ-config, which are very useful and offer more features, the goal is maximal simplicity:

  • A single decorator indicates that a class contains parsed environment variables.
  • The parsed variable and the environment variable share the same name.
  • Python's type hints are used to request type conversions.
  • Assignment with = specifies default values.

Thus, very little code is needed, and everything works nicely with static type checkers.

This design requires Python 3.6 or later. Earlier versions do not support annotating the types of class variables.

Installation

pip install simple-env-config

Usage

The library is imported with

import simple_env_config

or

from simple_env_config import env_config

The following examples use the latter.

String values

For string values, adding the str type hint is optional:

@env_config
class Strings:
    var1: str = "A"
    var2 = "B"

print(Strings.VAR1, Strings.VAR2)

The code above ill print the values of the environment variables VAR1 and VAR2. If any of these are undefined, the default values will be "A" and "B", respectively.

Values without defaults

If no default value is given for a variable in a class decorated with @env_config, and the environment variable does not exist, an exception is thrown:

@env_config
class Strings:
    required: str

results in

simple_env_config.EnvironmentVariableNotFoundError: "class 'Strings' expects a value of type <class 'str'> in the environment variable 'REQUIRED'"

if there is no environment variable named REQUIRED.

Converting to other data types

A type hint indicates the type that the parsed environment variable value should be converted to:

@env_config
class DataTypes:
    port: int = 8080
    tolerance: float = 1e-3
    debug_mode: bool = False

In most cases, a variable whose type hint is T will be initialized with the expression T(value), where value is the string content of the environment variable.

For some types, there are special conversion rules.

bool

Boolean values are initialized by comparing the string content of the environment variable case-insensitively with the values in these two groups:

  • "1", "true", "yes", "on",
  • "0", "false", "no", "off",

and assigning the value True or False, respectively.

Optional[T]

A variable with the type hint Optional[T] will be initialized just like a variable with type hint T. However, it gets the implicit default value None:

@env_config
class ConfigWithOptionals:
    A: Optional[int]
    B: Optional[bool]

If neither A nor B are valid environment variables, both A and B will be assigned the value None in this class.

Otherwise, the value of the environment variable A will be parsed as an int, and the value of B will be compared case-insensitively with "true", "yes", etc., to determine a Boolean value.

Conversion errors

If a conversion fails, either because the expression T(value) raises a ValueError, or applying the rule for types like bool and Optional[T] fails, a simple_env_config.CannotConvertEnvironmentVariableError is thrown.

Configuration

env_config can be called as a function and accepts a keyword argument upper_case_variable_names. This argument controls whether the variable names will be converted to upper case before looking up variables in the environment:

@env_config(upper_case_variable_names=False)
class CaseSensitiveConfig:
    key: str  # reads from env var 'key'
    Key: str  # reads from env var 'Key'
    KEY: str  # reads from env var 'KEY'

The default behavior is to consider only upper case environment variables:

@env_config
class DefaultConfig:
    # all these variables read from the env var 'KEY'
    key: str
    Key: str
    KEY: str

Notes on similar libraries

env-var-config also makes use of type hints for loading environment variable values into a config object. Notable differences are:

  • With simple_env_config, only a class decorator is needed to initialize the config object. With env_var_config, a base class and a function call are required.
  • Since simple_env_config stores the loaded values in the class that contains the type hints, and not in an instance of the class, it works better with static type checkers.
  • simple_env_config only accepts pre-defined input strings for bool values. For other inputs, it raises an exception, rather than converting them False.

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

simple_env_config-0.2.tar.gz (6.5 kB view details)

Uploaded Source

Built Distribution

simple_env_config-0.2-py3-none-any.whl (7.0 kB view details)

Uploaded Python 3

File details

Details for the file simple_env_config-0.2.tar.gz.

File metadata

  • Download URL: simple_env_config-0.2.tar.gz
  • Upload date:
  • Size: 6.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.50.0 CPython/3.8.0

File hashes

Hashes for simple_env_config-0.2.tar.gz
Algorithm Hash digest
SHA256 fa452dc48726d9ee01b2d499595d2e59a2551e1ec2a14688686d1171cdb04c1f
MD5 0455e321427932219770d866c465cb14
BLAKE2b-256 f0ab978df582aec2123845b5d00b33de44df88e2116a5390b7c05192b4516039

See more details on using hashes here.

File details

Details for the file simple_env_config-0.2-py3-none-any.whl.

File metadata

  • Download URL: simple_env_config-0.2-py3-none-any.whl
  • Upload date:
  • Size: 7.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.50.0 CPython/3.8.0

File hashes

Hashes for simple_env_config-0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 c4ead9cc74bd3fa89518b58dd9b334ba3dfe28c3a00a2e11310752b670aff3d2
MD5 b6918c9e98d3e15086cfa786cb8c9100
BLAKE2b-256 f6bf7e5c1c97520139c9abdc47bdc2614e07a22b5f66b13ef023de2d496a1455

See more details on using hashes here.

Supported by

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