你不会讨厌的命令行解析器
action的Python项目详细描述
在python中,这个库在命令行参数和函数参数之间绘制一个平行线。 位置被传递给常规函数参数,选项或标志被映射到关键字参数。
例如,此命令调用:
$ package install -u ffmpeg -v
可以转换为此函数调用:
package.install('ffmpeg', upgrade=True, verbose=1)
这个库自动进行桥接
使用以decorators和类型注释的形式提供的信息。
要使函数作为命令行操作可访问,请用action
:
import sys import action @action def install(package_name, *, upgrade: action.Flag = False, verbose: action.Count = 0): """ Do the work """ if __name__ == '__main__': sys.exit(action.execute(sys.argv[1:]))
所有其他导出的符号如下所述。
@动作
用于从函数中进行操作的主装饰器。 它接受单个函数作为输入并检查其签名。
正在创建的命令的名称 从原始函数的名称中提取。
splat之前的所有参数都算作位置参数, 后面的是选项或标志。
通过注释进行配置
客户端代码可以改变某些参数 通过注释其参数来处理和呈现。
一种方法是提供构造函数作为注释:
@action def add(x: int, y: int): print(x + y)
在执行时应调用该构造函数来强制类型 在将参数传递给调用的操作之前。
位置仅支持此类批注。
另一方面,选项以不同的方式使用可调用注释。 每个选项或标志可能出现多次, 因此,这种行为应该由相应的 注释。 有些理智的默认值已经打包好了。
标志
表示某个条件是否真实。
可以在命令行上指定任意次数。
第一个匹配项将值设置为True
。
后续事件不起作用:
@action def add(x: int, y: int, *, pad: action.Flag = False): result = x + y format = '{}' if pad: format = '{:04}' print(format.format(result))
计数
最初是None
。
第一次出现时设置为1,
在每个后续事件中递增一次:
@action def add(x: int, y: int, *, verbose: action.Count = 0): result = x + y if verbose > 3: print('augend:', x) print('addend:', y) print('sum: ', result) print() elif verbose > 0: print('{} + {} = {}'.format(result)) else: print(result)
键
指定为命令行选项的通用值:
@action def walk(*, depth: action.Key('depth', type=int)): ...
Key
构造函数有三个参数:short
、long
和type
。
需要short
或long
之一。type
默认为str
。
任何可调用的
也有一个用于指定密钥的速记符号:
@action def walk(*, depth: int): ...
短名称和长名称应从参数名称中推导出来。
(短、长、型)三重
另一个快捷键允许 手动指定短名称和长名称:
@action def walk(*, depth: ('r', 'depth', int)): ...
选项抽象基
在低级别上,要知道选项的值,命令行
处理器对所有事件执行折叠操作
一定的选择。
因此,要对参数解析进行细粒度控制
进程,一个可以子类action.Option
来使用它
而不是预先打包的选项注释。
子类应重写调用方法以获取两个参数:
旧价值和期权主体。
该调用方法可以返回新值或引发异常
立即停止命令行处理。
如果call方法返回一个值,则应传递该值
下一次通话时的旧值。
@操作。默认值
命令行处理器选择一个操作 其名称与第一个位置匹配。 如果没有登记此类诉讼, 命令行处理器尝试 调用标记为默认的特殊操作:
@action.default @action def install(package): ... # `./prog.py install ffmpeg` shall invoke `install('ffmpeg')` # and `./prog.py ffmpeg` shall still invoke `install('ffmpeg')`
如果程序 只有一个操作:
@action.default def list_directory(): ...
操作.执行
查找名称匹配的以前注册的操作 命令行中的第一个位置, 将命令行参数与选定的操作参数匹配 并调用该操作。
第一个位置参数对调用的命令隐藏。
action.execute
从不llsos.exit
,
所以它可以在交互提示中使用。
action.context
如果希望独立的参数解析器避免修改
对于模块范围的状态,可以实例化另一个Action
用这种方法。
通常,一个Action
对象被就地构造
导入时,action
模块的。
用爱来编码。