你不会讨厌的命令行解析器

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构造函数有三个参数:shortlongtype。 需要shortlong之一。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模块的。


用爱来编码。

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

推荐PyPI第三方库


热门话题
验证Java验证用户输入的一系列数字   java如何在SpringBoot中字段验证失败时在ConstraintViolationException中获取RequestParam名称   java如何解决Vertx阻塞DNS问题   java意外类型平均值   java如何将dataframe的UUID列转换为包含相同十六进制序列的简单字符串?   身份散列映射的java用法   java无法在eclipse中导入现有项目   进程从运行的java程序中获取CPU号   java将文本视图的特定行滚动到顶部在最后一个屏幕上不起作用   无法初始化java SpringSecurityFilterChain   java当我在项目中使用volatile时,为什么下面的代码显示不同的结果?   是否有转换java的标准方法。util。函数,消费者<T>转换为java。util。作用函数<T,Void>   java nginx分块传输编码失败   java如何将几个IF转换为一个循环   java URI从路径中删除/删除