Python argparse库 nargs参数(KIMI)
本文为和KIMI的对话记录,仅供参考:
nargs 是 Python 标准库 argparse 中用于指定命令行参数“应该消费多少个值”的关键参数。它决定了解析器在碰到该参数时,应该把它后面连续的多少个单词(以空格分隔)打包成一个列表赋给该参数。
1. 取值与含义速查表
| 取值 | 含义 | 示例命令行 | 得到的 Python 值 |
|---|---|---|---|
| 未给出(默认) | 只消费 1 个值 | --tag A |
'A' |
N(正整数) |
恰好 N 个值 | --coord 1.2 3.4 |
[1.2, 3.4] |
? |
0 或 1 个值 | -v 或 -v 4 |
True 或 4 |
* |
0 到任意多个值 | --file a.txt b.txt |
['a.txt','b.txt'] |
+ |
1 到任意多个值(至少 1 个) | --id 5 6 |
[5, 6] |
argparse.REMAINDER |
把“剩余所有”打包 | cmd --foo bar baz |
['bar','baz'] |
2. 逐项详解
2.1 默认(nargs 省略)
parser.add_argument('--name')
- 只能给一次,值是字符串。
- 重复给出会报错。
2.2 固定个数 N
parser.add_argument('--point', nargs=2, type=float)
- 必须一次性给足 2 个值,否则抛
ValueError。 - 解析后得到的是长度为 2 的列表:
[1.2, 3.4]。
2.3 可选值 ?
parser.add_argument('-q', '--quiet', nargs='?', const=True, default=False)
- 不带值:得到
const指定的值(这里是True)。 - 带值:得到用户给的值。
- 常用来实现“开关”或“可选带参”的场景。
2.4 任意多值 *
parser.add_argument('src', nargs='*')
- 可以 0 次或多次,解析后是列表。
- 位置参数里用
*可实现“可选的源文件列表”。
2.5 至少一次 +
parser.add_argument('--id', nargs='+', type=int)
- 不给会报错;给 1 个或多个均可。
- 结果一定是非空列表。
2.6 argparse.REMAINDER
parser.add_argument('args', nargs=argparse.REMAINDER)
- 把“遇到该参数之后的所有剩余单词”全部收进来,不再解析选项。
- 常用于封装子命令或透传参数给下游程序。
3. 易踩的坑
-
列表永远返回列表
即使nargs=1,结果也是长度为 1 的列表,而不是标量。 -
位置参数与可选参数混用
当位置参数带nargs='*'或+时,它会把后面所有非选项单词“吃光”,导致后面的位置参数得不到值。解决:- 把可变长位置参数放最后;
- 或用
--强制结束选项解析。
-
默认值与
const区别
default是“用户根本没出现该参数”时的回退值;
const是“用户写了参数但没带值”时的回退值;二者互不冲突。
4. 完整小例子
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-n', '--nums', nargs='+', type=int,
help='至少给一个整数')
parser.add_argument('--sum', action='store_true',
help='对 nums 求和')
args = parser.parse_args()
if args.sum:
print(sum(args.nums))
else:
print(args.nums)
运行:
$ python demo.py -n 1 2 3 --sum
6
5. 一句话总结
nargs 就是告诉 argparse:“这个参数后面要吞掉几个单词,打包成列表给我。” 掌握上面 6 种取值,就能灵活应对各种命令行接口需求。
浙公网安备 33010602011771号