将模块转换为dict

时间:2016-02-24 09:44:46

标签: python python-3.x dictionary module namespaces

我想做以下(python3):

在模块settings.py中:

message = 'Hello'

在模块__main__.py中:

from . import settings


def dict_from_module(module):
    ...
    return d

print(dict_from_module(settings))

运行它应该产生:

{'message': 'hello'}

是否有将模块转换为字典的规范方法?

修改

使用vars(settings)提供了大量内部信息:

{   
    '__builtins__': {
        ...
    },
    '__cached__': 'xxx/__pycache__/settings.cpython-34.pyc',
    '__doc__': None,
    '__file__': 'xxx/settings.py',
    '__loader__': <_frozen_importlib.SourceFileLoader object at 0x7f87fc192518>,
    '__name__': 'xxx.settings',
    '__package__': 'xxx',
    '__spec__': ModuleSpec(...),
    'message': 'bye'
}

我不想要/不需要。我可以过滤掉(通过删除以__开头的键),但如果有可接受的方法,我想避免乱砍。

3 个答案:

答案 0 :(得分:3)

希望这有帮助!

def dict_from_module(module):
    context = {}
    for setting in dir(module):
        # you can write your filter here
        if setting.islower() and setting.isalpha():
            context[setting] = getattr(module, setting)

    return context

答案 1 :(得分:1)

Anothoer选项是将__all__与模块一起使用以转换为字典。 例如,我导出的模块是

# mylib.py

__all__ = ['square']

def square(x):
    return x ** 2

您可以轻松地将此模块转换为字典,如下所示:

def module_to_dict(module):
    return {key: getattr(module, key) for key in module.__all__}

提供以下输出:

>>> import mylib
>>> module_to_dict(mylib)
{'square': <function square at 0x03C39B28>}

答案 2 :(得分:0)

我将python文件用作配置文件,其中具有常量和可计算的属性。为了与某些Web服务接口,我需要它可序列化(例如,像字典一样)。基于@heykarimoff的解决方案,我使用startswith("_")isinstance(v, ModuleType):过滤掉导入的模块,以使它们不会出现在字典中。

def dict_from_module(module):
    context = {}
    for setting in dir(module):
        if not setting.startswith("_"):
            v = getattr(module, setting)
            if not isinstance(v, ModuleType):
                context[setting] = getattr(module, setting)
    return context