智能配置框架
项目描述
Confit
Confit是一个完整且易于使用的配置框架,旨在通过依赖于Python类型系统、最小配置文件和命令行接口来提高实验的可重复性。
入门指南
使用pip安装库
pip install confit
Confit只抽象了与配置相关的样板代码,而其余代码保持不变。
以下是一个示例
script.py
+ from confit import Cli, Registry, RegistryCollection
+ class registry(RegistryCollection):
+ factory = Registry(("test_cli", "factory"), entry_points=True)
+ @registry.factory.register("submodel")
class SubModel:
# Type hinting is optional but recommended !
def __init__(self, value: float, desc: str = ""):
self.value = value
self.desc = desc
+ @registry.factory.register("bigmodel")
class BigModel:
def __init__(self, date: datetime.date, submodel: SubModel):
self.date = date
self.submodel = submodel
+ app = Cli(pretty_exceptions_show_locals=False)
# you can use @confit.validate_arguments instead if you don't plan on using the CLI
+ @app.command(name="script", registry=registry)
def func(modelA: BigModel, modelB: BigModel, seed: int = 42):
assert modelA.submodel is modelB.submodel
print("modelA.date:", modelA.date.strftime("%B %-d, %Y"))
print("modelB.date:", modelB.date.strftime("%B %-d, %Y"))
+ if __name__ == "__main__":
+ app()
创建一个新的配置文件
以下也适用于YAML文件
config.cfg
# CLI sections
[script]
modelA = ${modelA}
modelB = ${modelB}
# CLI common parameters
[modelA]
@factory = "bigmodel"
date = "2003-02-01"
[modelA.submodel]
@factory = "submodel"
value = 12
[modelB]
date = "2003-04-05"
submodel = ${modelA.submodel}
从终端运行以下命令
python script.py --config config.cfg --seed 43
您仍然可以从代码中调用function
方法,但现在还可以受益于参数验证!
from script import func, BigModel, SubModel
# To seed before creating the models
from confit.utils.random import set_seed
seed = 42
set_seed(seed)
submodel = SubModel(value=12)
func(
# BigModel will cast date strings as datetime.date objects
modelA=BigModel(date="2003-02-01", submodel=submodel),
# Since the modelB argument was typed, the dict is cast as a BigModel instance
modelB=dict(date="2003-04-05", submodel=submodel),
seed=seed,
)
modelA.date: February 1, 2003
modelB.date: April 5, 2003
序列化
您还可以序列化已注册的类,同时保持实例之间的引用
from confit import Config
submodel = SubModel(value=12)
modelA = BigModel(date="2003-02-01", submodel=submodel)
modelB = BigModel(date="2003-02-01", submodel=submodel)
print(Config({"modelA": modelA, "modelB": modelB}).to_str())
[modelA]
@factory = "bigmodel"
date = "2003-02-01"
[modelA.submodel]
@factory = "submodel"
value = 12
[modelB]
@factory = "bigmodel"
date = "2003-02-01"
submodel = ${modelA.submodel}
错误处理
您还可以从信息丰富的验证错误中受益
func(
modelA=dict(date="hello", submodel=dict(value=3)),
modelB=dict(date="2010-10-05", submodel=dict(value="hi")),
)
ConfitValidationError: 2 validation errors for __main__.func()
-> modelA.date
invalid date format, got 'hello' (str)
-> modelB.submodel.value
value is not a valid float, got 'hi' (str)
访问文档获取更多信息!
致谢
我们感谢巴黎公立医院援助组织和AP-HP基金会对本项目的资助。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪一个,请了解更多关于安装包的信息。
源分布
confit-0.6.0.tar.gz (33.7 kB 查看散列)
构建分布
confit-0.6.0-py3-none-any.whl (26.7 kB 查看散列)