click模块解析命令行参数

1. click模块简介

Click 是基于 Python 的命令行工具创建库。它提供了一组用于构建命令行应用程序的方便功能,并支持 Python 3.5, 3.6, 3.7, 3.8, 3.9。 它使开发人员能够轻松创建符合Unix流的命令行工具,并简化技术文档。 Click 不需要大量的样板,所以此库适用于经验丰富的开发人员和新手。

更多关于 Click 的详细介绍和使用方法,请参阅官方文档

2. 命令行参数

现代操作系统通常提供了命令行界面供用户和开发人员交互。命令行程序有许多参数组成,这些参数允许用户自定义程序的行为。命令行界面通常用于配置程序参数、运行程序、查询程序状态等等。在此方面,Python 提供了许多模块,其中 Click 是其中一个。

命令行程序通常由特定的输入参数调用。例如,在运行程序时,我们可以将“-h”选项与程序名称一起使用,以显示程序的帮助文档。此外,我们还可以将许多其他选项传递给数据,以进一步自定义程序行为。

2.1 参数类型

在 Click 中,有许多不同类型的参数可以使用。例如,我们可以为选项定义布尔值、数字和字符串类型。在此示例中,我们可以使用一个名为 click.option 的装饰器来为 Python 函数定义一个新的选项。该装饰器接受多个参数,其中之一是该选项的名称和/或缩写。

import click

@click.command()

@click.option("--count", default=1, help="Number of greetings.")

@click.option("--name", prompt="Your name", help="The person to greet.")

def hello(count, name):

\"\"\"Simple program that greets NAME for a total of COUNT times.\"\"\"

for i in range(count):

click.echo(f"Hello, {name}!")

if __name__ == '__main__':

hello()

使用 @click.option 装饰器定义参数。所有的选项都可以使几个不同的属性自定义。例如:

name: 参数名称。

short_name: 参数缩写。

default_value: 参数默认值。

help_message: 参数简短的用户帮助。

type_value: 参数类型

2.2 参数的解析

优秀的命令行应用程序应该易于解释。用户应该能够看到选项,并且可以理解每个选项做什么。在使用 Click 模块时,在您的代码中解析参数功能被提供。

解析参数是命令行框架中不可分割的一部分。这使得程序从命令行读取参数,并将这些参数转换为代码可用的格式。Click 中的命令详细说明给出了一些示例来理解参数如何解析。

例如,考虑以下带有两个参数的 Python 函数:一个字符串和一个数字。我们将一个字符串和一个数字参数传递给该函数。

import click

@click.command()

@click.option('--name', help='Enter your name')

@click.option('--age', help='Enter your age', type=int)

def parse_args(name, age):

click.echo(f"Name: {name}")

click.echo(f"Age: {age}")

if __name__ == '__main__':

parse_args()

运行脚本会要求用户提供输入的参数。命令行提示将向用户显示正确的输入参数格式。当用户满足一定条件后,程序会将使用给定的参数运行。

如下图所示:

![image.png](https://cdn.nlark.com/yuque/0/2021/png/20131441/1628049551037-dc8b19e1-baa4-4d68-a1a4-c76f662d97d1.png)

3. Click 模块解析命令行参数

在先前的示例中,我们要求用户提供字符串和数字参数。但是,如果用户没有提供值或输入无效值,函数将引发错误,并且用户被要求重新输入参数。

为此,我们可以通过有效的验证减少用户错误输入的可能性。Click 为此提供了许多实用程序,可用于解析和验证命令行参数。一些 Click 装饰器,如 @click.argument 装饰器将函数参数转换为命令行参数。同样,@click.option 装饰器允许为命令行选项提供默认值。

3.1 参数的验证

有时我们还希望确认命令行参数(类型或值)是否正确和有效。为此,Click 提供了有用的验证工具,例如内置的字符串验证工具和数字验证工具。

下面是一个示例,演示 Click 如何将函数参数转换为命令行参数,并在出现错误时提供错误反馈信息,以提示用户重新输入。

import click

@click.command()

@click.argument('matrix', metavar='[0,1,2][3,4,5][6,7,8]')

@click.option('--temperature', default=0.5, help='temperature of model')

@click.option('--top_k', default=5, help='top k tokens')

@click.option('--top_p', default=1.0, help='top p tokens')

@click.option('--model_path', default='./model/', help='the path where the model is saved')

def run(matrix, temperature, top_k, top_p, model_path):

click.echo('run')

if __name__ == '__main__':

run()

在以上示例中, Click 提供了内置的类型检查工具。例如,如果我们尝试在该演示中使用无效的字符串,Click 将引发错误:

![image.png](https://cdn.nlark.com/yuque/0/2021/png/20131441/1628049629548-335f691b-0204-4eaa-aa22-1bf3c6d805f5.png)

此外,Click 输入验证器还可以自定义。

3.2 验证方法的编写

有时内置验证方法可能不足以满足我们的要求,例如要检查设置的值是否在特定范围内,或者是否满足特定值的比率。在这种情况下,我们需要定义自己的验证方法。您可以设置自定义验证方法,然后在命令中调用它们。

下面是一个示例,该示例定义了一个新的验证方法,该方法限定要求输入的值在 0.1 到 0.9 之间。

import click

def validate_prob(ctx, param, value):

if not (0.1 < value < 0.9):

raise click.BadParameter("Prob must be in range 0.1 to 0.9")

return value

@click.command()

@click.option('--prob', default=0.5, callback=validate_prob)

def run(prob):

click.echo("Probability: {}".format(prob))

if __name__ == '__main__':

run()

这里,validate_prob 接受上下文、参数和值,并检查值是否在所需范围内。在此示例中,验证方法全部采用自定义方法 validate_prob,因此我们使用 @click.option 装饰器来注册新选项并在必要时定义调用的验证方法。

现在,如果我们尝试输入一个小于0.1 或大于等于0.9的值,我们将收到一个错误消息:

![image.png](https://cdn.nlark.com/yuque/0/2021/png/20131441/1628049676795-4a419293-a447-4399-aea2-c47bc86ea2e9.png)

4. 小结

总而言之,Click 是一个用于构建命令行界面的 Python 库,它具有许多功能和工具,可用于解析和验证各种类别的命令行参数。本文介绍了 Click 模块之后,通过示例介绍了参数类型、参数解析、参数验证和验证方法的编写。Click 提供了许多有用的工具,这些工具可以用于构建命令行界面,并使其更加易于使用和更完整。这些工具使您能够进行各种各样的验证,例如类型检查、必需项检查、值验证等,可以非常方便地处理参数。有了这些工具的帮助,您建立起自己的 Python 脚本的使用界面得到了一个很好的头绪。

后端开发标签