没有项目描述
desert的Python项目详细描述
docs | |
---|---|
tests | |
package |
在保持干燥的情况下反序列化为python对象。
安装
pip install desert
用法
下面是几个功能的演示。
- 从数据类(或attrs类)创建序列化架构。
- 从多个源创建对象:原始数据、代码、环境变量、配置文件。
- 创建用于构建复杂嵌套对象的命令行界面。
从数据类(或attrs类)创建序列化架构
定义一些数据类,可以很容易地将dict加载和转储到复杂的结构化数据中。
fromattrimportdataclassimportdesert@dataclassclassDB:host:strport:int@dataclassclassConfig:db:DBdebug:boollogging:booldry_run:bool=False# Define some nested data.data={"db":{"host":"example.com","port":1234},"debug":True,"logging":True}# Create a schema.schema=desert.schema(Config)# Use the schema to load the data into objects.config=schema.load(data)# Dump the objects back into raw data.assertschema.dump(config)==dict(data,dry_run=False)print(config)
$ python example.py Config(db=DB(host="example.com", port=1234), debug=True, logging=True, dry_run=False)
从代码、环境变量和配置文件中获取数据。
假设我们在环境变量和配置文件中有数据,并且 源代码中提供的不完整。
incomplete_data={"db":{"host":"example.com","port":1234}}multi=loaders.multi.Multi([loaders.raw.Raw(incomplete_data),loaders.env.Env(),loaders.appfile.AppFile(desert.encoders.toml.TOML(),filename="config.toml"),],data=dict(app_name="myapp"),)built=multi.build(App)assertbuilt==Config(DB(host="example.com",port=1234),debug=True,logging=True)print(built)
在位于~/.config/myapp/config.toml的配置文件中,我们设置了两个变量:
[config]debug=truelogging=false
我们使用环境变量启用日志记录:
exportMYAPP_CONFIG_LOGGING=1
现在运行程序,我们看到所有的值都已设置,并且环境 变量logging(true)的值已重写配置文件的值 那个变量(假)。这个优先顺序由 在multi([…])中列出装载机。最后缺少的值dry_run=False是 由数据类上设置的默认值确定。
$ python example.py Config(DB(host="example.com", port=1234), debug=True, logging=True)
创建用于构建复杂嵌套对象的命令行界面
注意
命令行api是实验性的,可随时更改,恕不另行通知。
如上所述,沙漠允许我们使用原始数据创建复杂的嵌套对象, 环境变量和配置文件。我们可以从 命令行。
例如,
$ myapp config --no-logging --dry-run db --host=example.com --port=1234
将创建如下python对象:
Config(db=DB(host="example.com",port=1234),logging=False,dry_run=True)
命令行演示
设置导入。
importosimportpathlibimporttypingastimportattrfromdesertimportencodersfromdesertimportloadersfromdesertimportrunnerimportdesert.encoders.tomlimportdesert.loaders.appfileimportdesert.loaders.cliimportdesert.loaders.envimportdesert.loaders.multi
首先我们定义一些类。
@attr.dataclassclassDB:host:strport:int@attr.dataclassclassConfig:db:DBdebug:boolpriority:float=attr.ib(default=0,metadata={"desert":{"cli":dict(param_decls=["--priority"],help="App priority value")}},)logging:bool=Truedry_run:bool=False
定义命令行界面。
defdance_(config):print("Dancing with config:\n",config)defsing_(config):print("Singing with config:\n",config)@attr.dataclassclassApp:dance:Config=dance_sing:Config=lambdac=None:sing_multi=loaders.multi.Multi([loaders.cli.CLI(),loaders.env.Env(),loaders.appfile.AppFile(desert.encoders.toml.TOML(),filename="config.toml"),],data=dict(app_name="myapp"),)built=multi.build(App)runner.run(built)
为演示创建配置文件。
[dance]logging=truepriority=3
运行应用程序。对象Config和DB按照上面Multi()中指定的顺序填充来自cli、envvars和config文件的数据。
$ MYAPP_APP_CONFIG_DRY_RUN=1 appconfig.py myapp dance --debug db --host example.com --port 9999 Dancing with config: Config(db=DB(host='example.com', port=9999), debug=True, priority=3.0, logging=True, dry_run=True)