您的位置:

Python argparse可选参数,让你的CLI工具更加灵活

一、什么是argparse

argparse是Python标准库中用于解析命令行参数和选项的模块。使用argparse,开发者可以方便的编写命令行工具,使其具有多种可选参数和选项,从而方便用户输入指定的命令,程序也可以更好的适应复杂的应用场景。argparse不仅简单易用,还可以针对不同的应用场景进行高级用法的扩展。

二、argparse的基本使用

使用argparse,首先要创建一个ArgumentParser对象,然后调用add_argument()方法添加参数和选项。下面是一个简单的例子:

import argparse
 
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                    help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the integers (default: find the max)')
args = parser.parse_args()
print(args.accumulate(args.integers))

在上面的例子中,我们首先定义了一个ArgumentParser对象parser,并指定了一个描述信息description。然后,我们使用add_argument()方法分别添加了一个位置参数N和一个可选项--sum。其中,metavar指定了参数的名称,type指定了参数的类型,nargs指定了参数的数量(表示我们想要接收多少个int类型的参数)。对于可选项,我们需要使用dest和action参数。dest指定了参数对应的名称,action表示这个参数是一个开关(store_true或store_false),还是保存一个常量或函数(store_const),等等。最后,我们使用parse_args()方法来解析参数,并返回一个命名空间对象args,包含了所有的参数和选项。我们可以通过属性的方式访问args中的具体参数,并将其传递给函数accumulate()。

三、argparse的高级用法

1. 互斥参数

有些情况下,我们需要让某些参数或选项互斥。在argparse中,我们可以使用add_mutually_exclusive_group()方法创建一个互斥组,把一些参数或选项添加到组中。例如:

import argparse

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('--foo', action='store_true')
group.add_argument('--bar', action='store_true')
args = parser.parse_args()

if args.foo:
    print('Foo')
elif args.bar:
    print('Bar')

在上面的例子中,我们创建了一个互斥组group,并向其中添加了两个选项--foo和--bar。当用户指定了--foo时,程序将打印'Foo';当用户指定了--bar时,程序将打印'Bar'。

2. 子命令

有时候,我们需要实现一个CLI工具,可以执行多个任务,每个任务有自己的参数和选项。在argparse中,我们可以使用add_subparsers()方法实现子命令。例如:

import argparse
 
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()

# 创建子命令parser1
parser1 = subparsers.add_parser('command1')
parser1.add_argument('--foo')

# 创建子命令parser2
parser2 = subparsers.add_parser('command2')
parser2.add_argument('--bar')

args = parser.parse_args()

if args.command == 'command1':
    print(args.foo)
elif args.command == 'command2':
    print(args.bar)

在上面的例子中,我们首先创建了一个ArgumentParser对象parser,并使用add_subparsers()方法创建了一个子命令subparsers。然后,我们使用add_parser()方法创建了两个子命令parser1和parser2,并向每个parser添加了自己的参数和选项。最后,我们使用parse_args()方法解析参数,并判断用户指定的是哪个子命令。

3. 自定义类型

在argparse中,默认支持常见的数据类型(int、float、str等),但有时候我们需要自定义类型。例如,我们想要接受一个日期字符串,并将其转换成datetime类型。在这种情况下,我们可以使用type参数实现:

import argparse
from datetime import datetime

def datestr(date_string):
    return datetime.strptime(date_string, "%Y-%m-%d")

parser = argparse.ArgumentParser()
parser.add_argument('start_date', type=datestr)
args = parser.parse_args()

print(args.start_date)

在上面的例子中,我们定义了一个datestr函数,将日期字符串转换成datetime类型。然后,我们使用type参数将datestr函数指定为参数的类型。当用户指定参数时,argparse会首先调用datestr函数,将用户输入的字符串转换成datetime类型。如果转换失败,argparse会抛出异常。

四、总结

argparse是Python标准库中一个非常强大和灵活的工具,可以帮助我们编写出更加易用和可扩展的命令行工具。它不仅支持常见的参数和选项,还可以实现互斥参数、子命令、自定义类型等高级用法。在实际的开发中,掌握argparse有助于我们更加快速高效地开发和维护CLI工具。