小能豆

Python argparse:组合“choices”、“nargs”和“default”时类型不一致

py

我有以下python程序:

#!/usr/bin/env python

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('arg', choices=['foo', 'bar', 'baz'], default='foo', nargs='*')

args = parser.parse_args()

print(args)

如果我像这样调用该程序:

./prog.py

输出是

Namespace(arg='foo')

但是如果我使用foo以下参数来调用该程序:

./prog.py foo

输出是

Namespace(arg=['foo'])

问题

我怎样才能让arg的默认值变成list

我试过了

我尝试过设置default=['foo']但结果是:

prog.py: error: argument arg: invalid choice: ['foo'] (choose from 'foo', 'bar', 'baz')

阅读 18

收藏
2024-11-12

共1个答案

小能豆

这里的问题是将其argparse解释default=['foo']为列表,与预期的单个字符串选择('foo''bar''baz')不匹配。设置nargs='*'允许多个值,但如果没有任何参数,它将arg默认视为空列表,而不是使用您指定的默认值。

为了确保arg始终是一个列表(包括未提供任何参数的情况),您可以将默认值设置为None,并在解析后处理为空的情况arg。具体操作如下:

#!/usr/bin/env python

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('arg', choices=['foo', 'bar', 'baz'], nargs='*', default=None)

args = parser.parse_args()

# Set default list value if `arg` is None or an empty list
if args.arg is None or len(args.arg) == 0:
    args.arg = ['foo']

print(args)

解释

  1. default=None:设置default=None允许您区分何时arg没有给出参数以及何时明确接收值。
  2. args.arg解析后的设置:解析后,如果args.argNone或为空列表([]),我们对其进行分配['foo']以确保它始终有一个列表作为默认。

示例输出

  • 如果调用时不带参数:

./prog.py

输出:

Namespace(arg=['foo'])

  • 如果使用以下方式调用foo

./prog.py foo

输出:

Namespace(arg=['foo'])

这样,arg即使使用默认值,也将始终是一个列表。

2024-11-12