argparse官网文档翻译及整理

本文详述了Python标准库中的argparse模块,用于处理命令行参数和选项。介绍了如何创建基本的命令行接口,包括位置参数、可选参数、短选项、长选项以及它们的使用方式。通过示例展示了如何定义参数、处理输入、处理错误以及创建有帮助信息的命令行程序。此外,还讨论了参数组和矛盾选项的概念,使程序的命令行接口更加灵活和用户友好。

This tutorial is intended to be a gentle introduction to argparse, the recommended command-line parsing module in the Python standard library.

这篇教程旨在作为 argparse 的入门介绍,此模块是 Python 标准库中推荐的命令行解析模块。

–help
import argparse
parser = argparse.ArgumentParser()
parser.parse_args() #需要,否则使用-h无输出

以下是该代码的运行结果:

$ python3 prog.py
$ python3 prog.py --help
usage: prog.py [-h]

optional arguments:
  -h, --help  show this help message and exit
$ python3 prog.py --verbose
usage: prog.py [-h]
prog.py: error: unrecognized arguments: --verbose
$ python3 prog.py foo
usage: prog.py [-h]
prog.py: error: unrecognized arguments: foo

--help 选项,也可缩写为 -h,是唯一一个可以直接使用的选项(即不需要指定该选项的内容)。

位置参数(positional arguments)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print(args.echo)

运行此程序:

$ python3 prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo
$ python3 prog.py --help
usage: prog.py [-h] echo

positional arguments:
  echo

optional arguments:
  -h, --help  show this help message and exit
$ python3 prog.py foo
foo
  • 我们增加了 add_argument() 方法,该方法用于指定程序能够接受哪些命令行选项。在这个例子中,我将选项命名为 echo,与其功能一致。即print(args.echo)语句实现。
  • 现在调用我们的程序必须要指定一个选项。即给定该位置参数的值,如foo
  • parser.parse_args()返回选项的指定值。即args.echo的值为foo

在本例中,我们可以知道 echo 是一个位置参数,但没法知道它是用来干什么的。所以,我们可以把它改造得更有用:

parser.add_argument("echo", help="echo the string you use here")

下面是一个计算平方数的示例:

argparse 会把我们传递给它的选项视作为字符串,我们需要告诉 argparse 来把这一输入视为整数:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument(
    "square", help="display a square of a given number", type=int)
args = parser.parse_args()
print(args.square**2)

以下是该代码的运行结果:

$ python3 prog.py 4
16
$ python3 prog.py four
usage: prog.py [-h] square
prog.py: error: argument square: invalid int value: 'four'

当这个程序在收到错误的无效的输入时,它甚至能在执行计算之前先退出,还能显示很有帮助的错误信息。

可选参数(optional arguments)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity")
args = parser.parse_args()
if args.verbosity:
    print("verbosity turned on")

输出:

$ python3 prog.py --verbosity 1
verbosity turned on
$ python3 prog.py
$ python3 prog.py --help
usage: prog.py [-h] [--verbosity VERBOSITY]

optional arguments:
  -h, --help            show this help message and exit
  --verbosity VERBOSITY
                        increase output verbosity
$ python3 prog.py --verbosity
usage: prog.py [-h] [--verbosity VERBOSITY]
prog.py: error: argument --verbosity: expected one argument
  • 这一程序被设计为当指定 --verbosity 选项时显示某些东西,否则不显示。
  • 不添加这一选项时程序没有提示任何错误而退出,表明这一选项确实是可选的。注意,如果一个可选参数没有被使用时,相关变量被赋值为 None。即if args.verbosity:为假。
  • 帮助信息有点不同。
  • 使用 --verbosity 选项时,必须指定一个值,但可以是任何值。

上述例子接受任何数值作为 --verbosity 的参数,但对于我们的简单程序而言,只有两个值有实际意义:True 或者 False。让我们据此修改代码:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()
if args.verbose:
    print("verbosity turned on")
else:
	print("verbosity turned off")

输出:

$ python3 prog.py
verbosity turned off
$ python3 prog.py --verbose
verbosity turned on
$ python3 prog.py --verbose 1
usage: prog.py [-h] [--verbose]
prog.py: error: unrecognized arguments: 1
$ python3 prog.py --help
usage: prog.py [-h] [--verbose]

optional arguments:
  -h, --help  show this help message and exit
  --verbose   increase output verbosity
  • 现在,这一选项更多地是一个标志,而非需要接受一个值的什么东西。我们甚至改变了选项的名字来符合这一思路。注意我们现在指定了一个新的关键词 action,并赋值为 "store_true"。这意味着,当这一选项存在时,为 args.verbose 赋值为 True。没有指定时则隐含地赋值为 False
  • 当你为其指定一个值时,它会报错,这符合作为标志的真正的精神。
  • 留意不同的帮助文字。即--verbosity VERBOSITY--verbose
短选项
parser.add_argument("-v", "--verbose", help="increase output verbosity",
                    action="store_true")
结合位置参数和可选参数
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
    print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity == 1:
    print("{}^2 == {}".format(args.square, answer))
else:
    print(answer)

输出:

$ python3 prog.py 4
16

$ python3 prog.py 4 -v
usage: prog.py [-h] [-v VERBOSITY] square
prog.py: error: argument -v/--verbosity: expected one argument
            
$ python3 prog.py 4 -v 1
4^2 == 16

$ python3 prog.py 4 -v 2
the square of 4 equals 16

$ python3 prog.py 4 -v 3
usage: prog.py [-h] [-v {0,1,2}] square
prog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)
                
$ python3 prog.py 4 -h
usage: prog.py [-h] [-v {0,1,2}] square

positional arguments:
  square                display a square of a given number

optional arguments:
  -h, --help            show this help message and exit
  -v {0,1,2}, --verbosity {0,1,2}
                        increase output verbosity

可以通过choices=[0, 1, 2]指定--verbosity 选项可以接受的值。

引入动作 count计数某一个可选参数出现了几次。

parser.add_argument("-v", "--verbosity", action="count",
                    help="increase output verbosity")

我们刚刚引入了又一个新的关键字 default。我们把它设置为 0 来让它可以与其他整数值相互比较。记住,默认情况下如果一个可选参数没有被指定,它的值会是 None,并且它不能和整数值相比较(所以产生了 TypeError 异常)。

parser.add_argument("-v", "--verbosity", action="count", default=0,
                    help="increase output verbosity")
矛盾的选项

到目前为止,我们一直在使用 argparse.ArgumentParser 实例的两个方法。 让我们再介绍第三个方法 add_mutually_exclusive_group()。 它允许我们指定彼此相互冲突的选项。 让我们再更改程序的其余部分以便使用新功能更有意义:我们将引入 --quiet 选项,它将与 --verbose 正好相反:

import argparse

parser = argparse.ArgumentParser(description="calculate X to the power of Y")
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.y

if args.quiet:
    print(answer)
elif args.verbose:
    print("{} to the power {} equals {}".format(args.x, args.y, answer))
else:
    print("{}^{} == {}".format(args.x, args.y, answer))

输出

$ python3 prog.py 4 2
4^2 == 16

$ python3 prog.py 4 2 -q
16

$ python3 prog.py 4 2 -v
4 to the power 2 equals 16

$ python3 prog.py 4 2 -vq
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
            
$ python3 prog.py --help
usage: prog.py [-h] [-v | -q] x y

calculate X to the power of Y

positional arguments:
  x              the base
  y              the exponent

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose
  -q, --quiet

请注意用法文本中有细微的差异。 注意 [-v | -q],它的意思是说我们可以使用 -v-q,但不能同时使用两者。

后记

除了这里显示的内容,argparse 模块还提供了更多功能。 它的文档相当详细和完整,包含大量示例。 完成这个教程之后,你应该能毫不困难地阅读该文档。

以下是符合技术文档规范的精准翻译,兼顾术语一致性与可读性: ### 第一阶段(Первая фаза) #### 任务说明(Задание) 现有一个包含大量大文件的文件夹,用户已整理了部分文件但未删除原文件。目前用户无法区分哪些文件已整理到其他文件夹,哪些仍未整理。需开发一款应用程序,帮助用户识别未整理的文件。 文件判定规则:若文件存在于原始文件夹中,但在所有目标文件夹中均不存在,则视为未整理文件。 --- ### 使用场景(Варианты использования) #### 用户操作(Пользователь) ##### 文件夹与路径管理(Управление папками и путями) - 指定已整理文件的文件夹路径 - 指定未整理文件的文件夹路径 - 清除已选文件夹历史记录 - 将上一个“未整理文件”文件夹作为新分析的数据源 ##### 操作执行(Запуск операций) - 生成所有已整理文件的列表 - 生成所有未整理文件的列表 - 查找未整理文件 - 将找到的未整理文件放入“未整理文件-日期-时间”文件夹,并保留原始文件夹结构 ##### 结果管理(Работа с результатами) - 以表格形式查看未整理文件列表 - 按文件名、日期、类型、大小对列表进行排序 - 显示未整理文件的数量 ##### 忽略列表管理(Управление игнор-листом) - 将文件添加到忽略列表(自动创建“忽略列表”文件夹) - 查看忽略列表中的文件 - 从忽略列表中恢复文件 --- ### 功能需求(Функциональные требования) #### 文件夹选择与管理 - 用户可指定已整理文件的根文件夹(程序将递归检查所有子文件夹,确认是否包含原始文件夹中的文件) - 用户可指定未整理文件的根文件夹(若根文件夹中包含子文件夹,程序将递归查找这些子文件夹中的文件是否已整理) - 程序应提供上一个创建的“未整理文件-日期-时间”文件夹,作为未整理数据的根文件夹选项 #### 信息显示 - 应用界面需以以下格式展示未整理文件:文件名、修改日期、文件类型、大小 - 应用界面需支持按文件名、日期、类型、大小对文件进行排序 #### 忽略列表管理 - 查找未整理文件的算法执行完成后,用户可在界面中将无需检查的文件添加到忽略列表 - 所有忽略列表中的文件均存入“忽略列表”文件夹(该文件夹与未整理文件的根文件夹位于同一目录) - 后续查找时,这些文件将被自动忽略,不纳入“未整理文件-日期-时间”文件夹 #### 文件扫描 - 程序需递归读取未整理文件根文件夹中的所有文件,并生成包含完整文件路径的列表 - 程序需递归读取已整理文件根文件夹中的所有文件,并生成包含完整文件路径的列表 #### 结果生成 - 程序执行完成后,需创建名为“未整理文件 日期-时间”的文件夹,存储未整理数据 - 若未整理文件的根文件夹中存在非空的子文件夹,需保留其子文件夹名称及内部文件(排除已整理文件) - “未整理文件-日期-时间”文件夹需创建在用户指定的未整理文件根文件夹所在目录 #### 会话保存 - 程序需保存上一次选择的已整理数据根文件夹路径 - 程序需保存所有已创建的“未整理文件”文件夹历史记录,供后续使用 #### 忽略列表保存 - 程序需在多次运行会话之间保留忽略列表状态 - 后续文件分析时,程序需自动应用忽略列表规则 #### 未整理文件判定逻辑 - 判定规则:文件存在于原始文件夹,但在所有目标文件夹中均不存在,则视为未整理 - 文件对比时需纳入忽略列表中的文件(即忽略列表文件不参与未整理判定) - 算法需递归处理嵌套文件夹结构 #### 目录结构处理 - 生成结果文件夹时,需保留原始子文件夹结构 - 文件的相对路径需以未整理文件根文件夹为基准进行保留 --- ### 非功能需求(Нефункциональные требования) - 应用需能高效处理大容量数据 - 应用需能高效处理大尺寸文件 - 应用需能稳定处理权限受限的文件 - 运行过程中产生的错误需记录日志,但不得中断程序执行 - 界面需简洁直观,便于用户操作 - 支持系统:Linux、Windows 10及以上版本 --- 根据此阶段内容,写出所需所有代码
最新发布
11-09
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值