我想做以下(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'
}
我不想要/不需要。我可以过滤掉(通过删除以__
开头的键),但如果有可接受的方法,我想避免乱砍。
答案 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