【问题标题】:argparse python two optionals in one variableargparse python 一个变量中有两个选项
【发布时间】:2017-08-10 01:31:54
【问题描述】:

我有一个带有以下参数的程序:

  1. 文件
  2. 目录
  3. 姓名1
  4. 姓名2

文件必须始终作为参数传递,目录可以也可以不传递,name1 和 name2 必须不传递任何一个或同时传递两个。

这就是我此刻所拥有的:

parser = argparse.ArgumentParser()
parser.add_argument("file", help="The file")
parser.add_argument("resources_dir", default='.', nargs='?', help="The directory of media files")
parser.add_argument("name", nargs=2, help="names")

帮助显示:

用法:wacv [-h] 文件 [resources_dir] 名称 名称

我希望它是:

用法:wacv文件[res_dir] [name1 name2]

但我希望“名称”参数就像我之前所说的那样。我怎样才能做到这一点?

【问题讨论】:

  • 假设names 只是字符串,你希望解析器如何确定name1 是否不是可选的res_dir(假设没有提供res_dir)?没有办法直接用argparse 强制0 or 2 语义,但您可以接受*,然后进行自己的错误检查。
  • 最后我决定在名字上接受 * 并检查自己是 0 还是 2,但我想知道是否有更好的方法来做到这一点

标签: python argparse


【解决方案1】:

我认为你应该使用

(`--names`, nargs=2)

这使它们成为可选的,但如果提供,则需要 2 个。还将这两个字符串与 `"resources_dir" 的可选字符串分开。

您可以使用nargs='*',允许 0、1 或更多。但是 2 个字符串将分配给 filedir; 3 到文件,目录,1 到名称等。换句话说,它不能通过内容来判断可选字符串是属于dir 还是属于names。它严格按位置进行。

在任何情况下都没有0 or 2 nargs,除非我在上面建议。

【讨论】:

  • 很好的解决方案。我一直在寻找类似的东西。我仍然认为这样做有点奇怪,但它确实有效。
猜你喜欢
  • 2013-04-12
  • 2017-06-15
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 2019-01-28
  • 2012-10-01
相关资源
最近更新 更多