懒人的参数解析
argz的Python项目详细描述
懒汉的参数解析。
核心概念
- 简单胜过健壮
- 脚本需要参数
- 使用此脚本的"使用者"本身就是开发人员
用法
# $ cat example.pyimportjsondeffunc(jsondict,dbg=False):""" put descriptive docstring here """pass# use jsondictif__name__=='__main__':importargzf=argz.route(func)f.jsondict.adapter=[open,json.load]# will be chainedargz.go()# will use sys.argv as input
跑步:
$ example.py Usage:example.py jsondict [-dbg]for detailed help, use any of (-h, /h, -?, /?, /help, --help)
$ example.py -h |> jsondict [-dbg]|| jsondict| adapter | [<built-in function open>, <function load at 0x0336B1B0>]| dbg| default | False| adapter | <type 'bool'>||- - doc - -|| put descriptive docstring here|_ _ _ _ _ _
安装
下载文件或使用pip:
pip install argz
传递参数:命名vs位置
可以按名称或位置传递任何参数。 如果参数以双破折号开头,则该参数将被视为已命名,否则*将被视为位置参数。
您可以传递位置参数和命名参数的混合,因为argz
将跟踪哪些参数将根据函数定义中的顺序进行解析。
*除了开关之外
文件中的参数
要将参数从文件传递到脚本,可以在其路径前面加上@
。这必须是传递给脚本的第一个参数。如果有多个路由,则必须将路由名称作为第一个参数包含在文件中。
当前argz
不允许文件输入和命令行输入的混合。
适配器
接受字符串参数并返回"adapted"值的可调用对象,该值稍后将传递给路由函数。
如果适配器是一个序列,则每个适配器都将被链接,以便前者的返回值被传递给后者,使用最后一个返回值作为路由函数的输入。
要中止解析过程,可能会引发任何异常。消息
属性将打印给用户。
验证器
用于在进行任何调整之前验证输入。可以是以下类型之一:
- regex string:将用于与输入匹配
- 可调用对象:将使用输入字符串调用。任何异常或非truthy值都将中止解析过程并向用户显示消息。
- 任何实现
\u的对象都包含
deffunc(alphanum,filepath,key,novalidation):""" put descriptive docstring here """pass# ...f=argz.route(func)f.alphanum.validator='[a-zA-Z0-9]{2,}'f.filepath.validator=os.path.isfilef.key.validator={'option1':1,'option2':2}argz.go()
最小/最大
您可以为参数设置最小值和/或最大值:
deffunc(count):""" put descriptive docstring here """pass# ...f=argz.route(func)f.count.min=1# same for maxargz.go()
验证和适配器运行后,将检查这些约束。
两个值都包含在内。例如,无符号字符
范围将是:
min=0;max=0xff
回退与默认值
设置任何一个参数都将视为可选,但是,它们有一个主要区别:
< Buff行情>默认值是将传递给调用的路由而不进行任何解析或验证的任何值。
< Buff行情>fallback是一个字符串值,它将通过所有验证和分析,就像是通过命令行指定的一样。
如果参数不是通过命令行提供的,argz
将使用回退
或默认
。回退
值优先。
如果在函数定义中指定了默认值,argz
将使用它作为参数的默认值,并在某些情况下推断默认适配器(请参见受支持的推断适配器
)。
开关
具有默认布尔值的函数参数将被推断为开关。这意味着此参数也可以使用单个破折号传递,后面没有值(例如-dbg
)。这样做将"切换"默认值(false
到true
,反之亦然)
上面example.py
代码中的dbg
参数演示了这一点。
使用拆分
设置参数的split
成员会更改一些内容:
- 将使用该字符串拆分输入
- 如果设置,将根据列表的长度检查
min
\max
值 瓦利将分别为列表中的每个项调用数据或分析器
瓦拉格斯和夸格斯:
如果函数接受它们,则任何附加的位置参数和命名参数将分别以varargs/kwargs形式传递。
适配器和验证器将与整个列表/字典一起调用,它们必须返回相同类型的值。
访问函数参数
设置参数属性有两种方法:
- 姓名:
f=argz.route(func)f.myvar.min=1
- 按索引:
f=argz.route(func)f[0].min=1< Buff行情>
注意:参数名区分大小写
分析流
下图说明了分析参数的流程(varargs\kwargs不支持拆分输入):
+------------+ +-----------+ +-----------+
| fallback | | input | | default |
+-----+------+ +-----+-----+ +-----+-----+
| | |
+-------+-------+ |
| |
v |
+----+-----+ |
| split? | |
+---+-+----+ |
| | |
| | Yes |
+----------+ v |
| +--------+--------+ |
No | | min / max len | |
| +--------+--------+ |
+-------+ | |
| | +-----------+ |
V v v | |
+--------+----+---+ | |
| | | |
| validator | | |
| + | | |
| v | | |
| adapter chain | | |
| | | |
+--------+----+---+ | |
| | | |
| | split? | |
| | | |
| +-----------+ |
+--------+---------+ |
| min / max check | (if not split) |
+--------+---------+ |
| |
v |
+-------+--------+ |
| return value | <------------------+
+----------------+
使用多个路由
您可以使用argz
导出多个不同的路由。
这意味着用户必须选择要运行的程序:
# $ cat example.pyimportjsondeffunc(jsondict,dbg=False):""" put descriptive docstring here """pass# use jsondictif__name__=='__main__':importargzf=argz.route(func)f.jsondict.adapter=[open,json.load]# will be chainedargz.go()# will use sys.argv as input0
跑步:
# $ cat example.pyimportjsondeffunc(jsondict,dbg=False):""" put descriptive docstring here """pass# use jsondictif__name__=='__main__':importargzf=argz.route(func)f.jsondict.adapter=[open,json.load]# will be chainedargz.go()# will use sys.argv as input1
# $ cat example.pyimportjsondeffunc(jsondict,dbg=False):""" put descriptive docstring here """pass# use jsondictif__name__=='__main__':importargzf=argz.route(func)f.jsondict.adapter=[open,json.load]# will be chainedargz.go()# will use sys.argv as input2 < Buff行情>
注意:只要有多个可用的路由,就允许路由在没有参数的情况下运行。
覆盖默认值
通过将doc
参数传递到route
可以指定显示详细帮助时要打印的自定义文档字符串。要完全抑制它,请传递一个空字符串。
如果您使用的单个路由接受名称位于help_options
中的参数,则可以在调用go
时指定custom_help_options
列表来替换这些参数。
测试时间
- python 2.7.15,Windows 10
- Python 3.7.2,Windows 10
故障排除
要启用日志记录:
# $ cat example.pyimportjsondeffunc(jsondict,dbg=False):""" put descriptive docstring here """pass# use jsondictif__name__=='__main__':importargzf=argz.route(func)f.jsondict.adapter=[open,json.load]# will be chainedargz.go()# will use sys.argv as input3
日志级别
将传递到logger.setlevel
测试
添加了一些单元测试,运行run tests.bat
许可证
麻省理工学院< /P>
待办事项
- 允许文件输入和命令行输入的混合
- 规范化/删除参数名中的下划线(
/code>)
- 使用
route
对象属性处理名称冲突- 根据类型注释/提示推断(PY3签名?)
- 使用
查看代码:
# $ cat example.pyimportjsondeffunc(jsondict,dbg=False):""" put descriptive docstring here """pass# use jsondictif__name__=='__main__':importargzf=argz.route(func)f.jsondict.adapter=[open,json.load]# will be chainedargz.go()# will use sys.argv as input4