仅当参数未出现时,使用默认值Argparse append操作

2024-09-30 16:33:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用argparse库解析程序中的CLI参数。我想解析一个可以重复的参数,其行为如下:

  • 如果参数至少出现一次,其值将存储在列表中
  • 如果参数未出现,则该值为某个默认列表

到目前为止,我有以下代码:

import argparse
ap = argparse.ArgumentParser(description="Change channel colours.")
ap.add_argument('-c', '--channel', action='append', default=['avx', 'fbx'])
print(ap.parse_known_args(['-c', 'iasdf', '-c', 'fdas']))
print(ap.parse_known_args())

这会适当地设置一个默认列表,但是当参数出现时,它不会以空列表开始。换句话说,第二个print语句打印正确的值(默认列表),但第一个语句打印正确的值

['avx', 'fbx', 'iasdf', 'fdas']

而不是

['iasdf', 'fdas']

argparse中有没有一种方法可以做我想做的事情而不做类似的事情

if len(args.channel) > 2:
    args.channel = args.channel[2:]

事后呢


Tags: 列表参数parsechannelargparseargs语句事情
1条回答
网友
1楼 · 发布于 2024-09-30 16:33:15

讨论此行为时出现错误/问题。我为此写了几篇帖子

https://bugs.python.org/issue16399argparse:使用默认列表的追加操作将添加到列表而不是覆盖

目前唯一的变化是文档,而不是行为

解析开始时,所有默认值都放在名称空间中。对于普通操作,用户值将覆盖默认值。但是在append的例子中,它们只是添加到已经存在的内容中。它不会尝试区分默认设置的值和以前的用户值

我认为最简单的解决方案是保持默认值不变,并在解析后检查None或空列表(我不记得是哪个),然后插入默认值。在argparse中进行所有解析不会得到额外的分数。稍微做一点后解析处理就可以了

相关问题 更多 >