view configmix/py.py @ 10:58af59d5af40

A "safe_merge" that makes (shallow) copies instead of directly manipulating given containers
author Franz Glasner <f.glasner@feldmann-mg.com>
date Wed, 09 Mar 2016 11:19:20 +0100
parents caaaddb11db1
children 04505a8dbfc0
line wrap: on
line source

# -*- coding: utf-8 -*-
r"""Read configuration settings from Python files

"""

from __future__ import division, absolute_import, print_function

import locale

from .compat import PY2


__all__ = ["load"]


def load(filename, extract=None):
    if extract is not None:
        if not isinstance(extract, (type([]), type(tuple()), type(set()), )):
            raise TypeError("`extract' must be a sequence")
    gcontext = dict()
    lcontext = dict()
    if PY2:
        filename2 = filename.encode(locale.getpreferredencoding())
    if PY2:
        execfile(filename2, gcontext, lcontext)
    else:
        # "rb" mode allows Python to derive the encoding automatically
        with open(filename, "rb") as vf:
            code = compile(vf.read(), filename, "exec")
            exec(code, gcontext, lcontext)
    if extract is None:
        if "__all__" in lcontext:
            extract = lcontext["__all__"]
        else:
            extract = [k for k in lcontext if not k.startswith('_')]
    # don't bail on non-existing keys
    extract = [v for v in extract if v in lcontext]
    return dict(zip(extract, [lcontext[v] for v in extract]))