2017-08-10 62 views
0

我有以下参数的程序:argparse蟒蛇2个自选单变量

  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]

但是我希望'name'参数像我之前讲的那样。我怎样才能做到这一点?

+0

假设'names'只是字符串,你如何期待解析器决定'name1'是不是可选'res_dir'(假设没有提供'res_dir')?没有办法直接用'argparse'强制'0或2'语义,但是你可以接受'*'然后做你自己的错误检查。 – AChampion

+0

最后,我决定接受*名称和检查后我自己如果是0或2,但我想知道是否有更好的方法来做到这一点 – xBlackout

回答

1

我认为你应该使用

(`--names`, nargs=2) 

这使得他们可选的,但如果提供的,它需要2。此外,它的2串从可选一个`“resources_dir”分开。

您可以使用nargs='*',允许0,1或更多。但是2个字符串将分配给file,dir; 3表示文件,dir,另一个表示名称等。换句话说,它不能通过内容告诉可选字符串是否属于dirnames。它严格按照位置进行。

在任何情况下,不存在0 or 2 nargs,除非我如上所述。

+0

好的解决方案。我正在寻找那样的东西。我仍然觉得这样做有点奇怪,但它的工作原理。 – xBlackout