argparse在 nargs='*' 时结果不一致

编程语言 2026-07-12

我在使用argparse时,当 nargs='*' 时,得到的不正确的结果。 当我把下面的代码按 foo -l 运行时,输出如下:

verb = None

如果我按 foo -l alpha 运行,它会输出:

LIST

verb = LIST

这是一个bug吗,还是我使用得不对?

import argparse
def parse_cmd_line():
    verb = None
    parser = argparse.ArgumentParser( description = 'stuff')
    parser.add_argument('-l', '--list', nargs='*', default=None, help='list contents' )
    args = parser.parse_args()
    if (args.list):        verb = 'LIST';        print("LIST")
    print("verb = ", str(verb))

parse_cmd_line()

解决方案

正如 @Anerdw所述,你的逻辑错误出在 if args.list: 的检查上。这里检查的是 args.list 的“真值”,其中“真值”定义为:不是 None;数值类型为非0;列表、序列、集合、字典等为非空;或者更一般地,如果对象的 __bool__() 方法返回 True

我想你要检查的是 if args.list is not None:,它即使在空列表时也会触发,但如果 args.listNone,则不会触发(像根本没有指定 -l 选项时那样)。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章