Skip to content

Instantly share code, notes, and snippets.

@AndBondStyle
Created January 3, 2020 12:22
Show Gist options
  • Save AndBondStyle/3c6cb479259d5027ba9d9c7ae65c24f4 to your computer and use it in GitHub Desktop.
Save AndBondStyle/3c6cb479259d5027ba9d9c7ae65c24f4 to your computer and use it in GitHub Desktop.
[Python] Read environment variables from .env file
import urllib.parse as urlparse
from envparse import Env
import json as pyjson
import warnings
import os
def shortcut(cast):
# Fix: `default` kwarg is always second argument
# So you can do `env.whatever('KEY', 'DEFAULT')`
def method(self, var, default=None, **kwargs):
return self.__call__(var, cast=cast, default=default, **kwargs)
return method
class Environ(Env):
"""
Thin envparse wrapper
"""
# Improved shortcuts
bool = shortcut(bool)
dict = shortcut(dict)
float = shortcut(float)
int = shortcut(int)
list = shortcut(list)
str = shortcut(str)
json = shortcut(pyjson.loads)
url = shortcut(urlparse.urlparse)
def read_envfile(self, path=None, **overrides):
# Temporarily proxy `setdefault` to `setitem`
# So that .env file priority is higher
setdefault = os.environ.setdefault
os.environ.setdefault = os.environ.__setitem__
with warnings.catch_warnings():
# Get rid of annoying warning
warnings.simplefilter('ignore')
super().read_envfile(path=path, **overrides)
os.environ.setdefault = setdefault
# Convenient global var
env = Environ()
env.read_envfile()
@AndBondStyle
Copy link
Author

Requirements:

Syntax example:

VAR=VALUE  # COMMENT
BOOL=YES   # "true", "on", "ok", "y", "yes", "1" -> True
DICT=key=value,comma=separated
LIST=just,comma,separated
JSON="{\"arbitary\": [\"json\", 123]}"
URL="https://github.com/path?query"
FLOAT=3.14
INT=123

Usage:

from environ import env

env.str('VAR')      # -> 'VALUE'
env.bool('BOOL')    # -> True
env.dict('DICT')    # -> {'key': 'value', 'comma': 'separated'}
env.list('LIST')    # -> ['just', 'comma', 'separated']
env.json('JSON')    # -> {'arbitary': ['json', 123]}
env.url('URL')      # -> urllib.parse.ParseResult(...)
env.float('FLOAT')  # -> 3.14
env.int('INT')      # -> 123

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment