【问题标题】:How to require arguments in argparse and make them non-positional?如何在 argparse 中要求参数并使它们非位置?
【发布时间】:2017-10-23 23:12:27
【问题描述】:

我有一个 Python 脚本,我想在其中强制命名所有必需的参数(非位置)。

所以以下应该可以工作:

python myscript --arg1 arg1 --arg2 arg2 python myscript --arg2 arg2 --arg1 arg1

但以下应该失败:

python myscript arg1 arg2 python myscript --madeUpArg arg1 --arg2 arg2

据我所知,在 argparse 中,如果你做了一些需要的东西,它就会变成一个位置参数,所以我想要失败的第二个例子都会成功(即使是第二个例子,也有虚构的参数!)。如何获得所需的功能?

【问题讨论】:

  • 我要指出,有一个通用的约定,要求的参数应该是位置的,而开关(带有破折号的开关,如--arg1)应该是可选的。并不是说你必须那样做,而是要知道你会给一些人扔一个曲线球,可以这么说 - 他们可能不希望程序需要非位置参数。
  • 这个required 段落并没有说它变成了positionaldocs.python.org/3/library/argparse.html#required。您是否尝试过required 参数?
  • 如果您不喜欢 help 标记所需命名参数的方式,请使用 argument_group docs.python.org/3/library/argparse.html#argument-groups

标签: python argparse


【解决方案1】:

只要您不显式调用parse_known_args,任何未定义的参数都不会被接受。

要使其他可选参数成为必需参数,请在定义时使用 required 关键字参数。

p = argparse.ArgumentParser()
p.add_argument("--arg1", required=True)
p.add_argument("--arg2", required=True)

【讨论】:

  • 我意识到让我感到困惑的部分原因是参数解析器默认会接受任何明确的参数前缀。例如。如果您只有一个参数--arg1,它将接受--ar。这让我觉得它没有正确地要求这些论点。
  • hmmmm.... 上面的 3 行看起来不错,但是您使用什么来解析参数(即 parser.parse_args?pparser.parse_intermixed_args?)?
  • 我假设基本熟悉 argparse 的工作原理:args = p.parse_args()
猜你喜欢
  • 1970-01-01
  • 2017-09-03
  • 2022-12-01
  • 2014-10-14
  • 2016-02-02
  • 2011-05-27
  • 2014-05-11
  • 1970-01-01
  • 2017-02-23
相关资源
最近更新 更多