没有项目描述

desert的Python项目详细描述


docsDocumentation Status
tests
Travis-CI Build StatusAppVeyor Build Status

package
PyPI Package latest releasePyPI WheelSupported versionsSupported implementations
Commits since latest release

在保持干燥的情况下反序列化为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

运行应用程序。对象ConfigDB按照上面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)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用split函数分割字符串,但没有得到期望的结果   未找到包含derby数据库嵌入架构的sql Java桌面应用程序错误   java elasticsearch vs solr用于定制全文搜索系统   java Android:创建没有startOffset的动画延迟?   java如何查看其他应用程序接收的数据?   java如何在Linux中使用D和classpath选项运行jar文件   java和域设计最佳实践   具有相同内存位置的java数组,将显示为输出   连接到java中的elasticsearch?   Java Playframework重定向到带有Json负载的外部url   java无法在Android平台上使用InputStream为蓝牙socket创建ObjectInputStream   使用POI将Excel日期转换为Java日期,年份未正确显示   oracle从数据库层还是Java层调用webservice?