python argparse 默认参数与给定参数

python argparse default arguments versus given arguments

使用python 3.8 argparse:

def_value= 'whatever'
argParser.add_argument ("-w", "--whatever", type=str, nargs=1, default=def_value, help="Whatever. Defaults to %s"  % def_value)
args= argParser.parse_args()
print (args.whatever)

如果我调用我的程序传递带有值的选项 -w,args.whatever 是一个列表。我的意思是:

myprog -w just_a_test
[just_a_test]

但是,我什么都不传递,默认参数是一个字符串。

myprog
whatever

这很烦人,我的意思是,我必须在使用它之前测试 args.whatever 的类型; 如果它是一个字符串,就把它当作字符串使用;如果它是一个列表,我必须将它用作 args.whatever[0],你看到了吗?

处理此类事情的最佳方法是什么?

PS:我认为它特定于 3.x,因为我记得 2.x 一直返回字符串。

您是否尝试删除 nargs 选项?

使用n_args参数会将值包装在一个列表中,因此,有两个选项:
1. 删除 nargs 参数。

def_value= 'whatever'
argParser.add_argument("-w", "--whatever", type=str, default=def_value, help="Whatever. Defaults to %s"  % def_value)
args= argParser.parse_args()
print(args.whatever)

argparse 默认只允许一个参数,所以在这种情况下,无论是否传递参数,你总是得到一个字符串,当你试图传递超过 1 个值时,你会得到一个错误。

2.wrap def_value 列表:

def_value= ['whatever']
argParser.add_argument("-w", "--whatever", type=str, nargs=1, default=def_value, help="Whatever. Defaults to %s"  % def_value)
args= argParser.parse_args()
print(args.whatever)

现在默认值和传入值都将是一个包含单个字符串的列表,并且当您传递超过 1 个值时也会引发错误。

以上两种解决方案应该可以实现相同的目标,具体取决于您喜欢哪一种