用于系统地组织从数据库、环境变量、参数文件或用户选择中获取的用户首选项的模块。
propargs的Python项目详细描述
丙烷
用于系统地组织从数据存储、环境变量、参数文件、命令行和/或用户选择中获取的用户首选项的模块。
工作原理
概述
propargs通过依次加载以下五个输入阶段来初始化:
- 数据存储
- 属性字典
- 环境
- 命令行
- 用户
以上是默认顺序。用户可以更改该顺序。
可以在除用户以外的任何阶段添加属性。在一个阶段中定义的属性可能在以后的阶段中被覆盖。
每个属性都有一个键和一个值,可以像字典一样访问:
>>> pa = PropArgs.create_props()
>>> pa["prop_nm"] = 1 # assigns the value 1 to the property "prop_nm"
>>> pa["prop_name"]
1
除此之外,每个属性可能都有关联的元数据。这些是目前的问题 用户输入提示、数据类型、上限和下限。如果在装载过程中的任何时候 元数据规则被破坏(例如,val超过上限)将引发错误。
该系统与为IPython和Jupyter开发的TraceTeT配置模块有一些相似之处,但是更灵活,从更多的来源寻找配置信息,并且不与Python类相关联。(属性结构本身保留配置信息,但这些值可以加载到类中,也可以不根据应用程序的需要加载。)
详细信息
数据存储
数据存储将是json文件或数据库。
数据存储文件将在初始化时指定
PropArgs.create_props(ds_file=file_name)
json格式如下:
{
"prop_name_1": {
"val": 1,
"question": "What value should this property have?",
"atype": "INT",
"hival": 10,
"lowval": 0
},
"prop_name_2": {
"val": "Hello World."
},
"prop_name_3": {
}
}
请注意,属性不需要定义所有(或任何)字段。如果未指定“val”,则默认为None
。
数据库数据存储的详细信息…
属性字典
可以通过在初始化时传递字典来加载属性:
>>> pa = PropArgs.create_props(prop_dict=prop_dict)
字典格式如下:
{
"prop_name_1": {
"val": 1,
"question": "What value should this property have?",
"atype": "INT",
"hival": 10,
"lowval": 0
},
"prop_name_2": {
"val": "Hello World."
}
}
环境
propargs将读取并添加初始化propargs的程序的所有环境变量。 (即python的os.environ中的所有内容)
命令行
将从命令行读取属性,如下所示
$ python program_reading_props.py --props prop_1=val_1,prop_2=val_2,prop_3=val_3 #etc...
用户
最后一步是请求用户输入。只会提示用户有关有问题的属性。
默认行为是在客户端的命令行上提示问题:
>>> pa = PropArgs.create_props()
What is the value of prop_1? ("I'm the default prop value") <enter_value>
What is the value of prop_2? [0.0-100.0] (20) <enter_value>
然而,客户端程序可能以自己的方式接管和提问。在这种情况下,我们将提供一个标志
这将跳过用户阶段,而客户端将调用pa.get_questions()
来获取属性的json
问题。
>>> pa = PropArgs(skip_user_questions=True)
>>> pa.get_questions()
{
"prop_name_1": {
"val": 2.0,
"question": "",
"atype": "DBL",
"hival": 10.0,
"lowval": -0.5
},
"prop_name_2": {
"val": "default",
"question": "What should prop_name_2 be?"
}
}
可以通过其他方式添加或修改道具
除了访问propargs对象(如字典)外,还可以通过
get(key, default=None)
方法。或者如果密钥尚未与属性关联,
新属性将绑定到default
(如果未指定default
,则绑定到None
)。
>>> pa = PropArgs.create_props()
>>> pa.get('new_prop', default=2)
2
>>> pa.get('newer_prop')
None
学分
想法-罗伯特·多德森
发展-吉恩·卡拉汉和内森·康罗伊