【问题标题】:Argparse append action with default value only if argument doesn't appear仅当参数未出现时,argparse 才使用默认值附加操作
【发布时间】:2020-04-26 23:22:06
【问题描述】:

我正在使用 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:]

事后?

【问题讨论】:

  • 1.您可以采取相反的方式 - 从解析器本身中删除默认值,稍后只需检查并附加默认值(如果为空)。 2. 你可能会尝试,比如,一个具有相同目标的互斥组?真正的-c 会有空的默认值,而虚拟的会有真正的默认值?我不确定这会奏效。我会玩这个想法并返回给你
  • 3. “您还可以通过传递一个 Action 子类或其他实现相同接口的对象来指定任意操作。推荐的方法是扩展 Action,覆盖 __call__ 方法和可选的 __init__ 方法。” + Action 本身的文档:docs.python.org/3/library/argparse.html#argparse.Action

标签: python python-3.x command-line-interface argparse


【解决方案1】:

存在讨论此行为的错误/问题。我为此写了几篇文章。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 2015-09-28
    • 1970-01-01
    • 2018-10-13
    • 2014-12-07
    • 1970-01-01
    • 2017-10-13
    • 2019-05-09
    • 1970-01-01
    相关资源
    最近更新 更多