GNU getopt和使用它的命令行工具允许交叉选项和参数,称为置换选项(参见http://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html#Using-Getopt) . Perl的Getopt :: Long模块也支持这个(使用qw(:config gnu_getopt)) . argparse似乎不支持(甚至提及)置换选项 .
有许多与arg / opt命令相关的SO问题,但似乎没有人回答这个问题:argparse可以像getopt那样置换参数顺序吗?
用例是一个典型的命令行签名,如GNU sort:
sort [opts] [files]
其中1)选项和文件被置换,以及2)文件列表可以包含零个或多个参数 .
例如:
import argparse
p = argparse.ArgumentParser();
p.add_argument('files',nargs='*',default=['-']);
p.add_argument('-z',action='store_true')
p.parse_args(['-z','bar','foo']) # ok
p.parse_args(['bar','foo','-z']) # ok
p.parse_args(['bar','-z','foo']) # not okay
usage: ipython [-h] [-z] [files [files ...]]
我试过了:
-
p.parse_known_args - 实际上也不会对其进行置换,并且它不会忽略看起来像无效选项的参数(例如,--bogus或-b above) .
-
p.add_argument('files',nargs = argparse.REMAINDER) - 选项-z包含在文件中,除非在位置参数之前
-
p.add_argument('files',nargs = '*',action = 'append');
我想实现一些接近上面GNU排序原型的东西 . 我对可以为每个文件指定的标志不感兴趣(例如,-f file1 -f file2) .
2 回答
这是一个快速的解决方案,它一次解码参数列表一(选项,位置参数)对 .
输出:
注意:不要尝试将此与其他非标志参数一起使用(除了单个
nargs='*'
参数和args_tail
参数) . 解析器将不知道parse_args
的先前调用,因此它将为这些非标志参数存储错误的值 . 作为解决方法,您可以在使用interleaved_parse
后手动解析nargs='*'
参数 .我在argparse文档中没有看到任何明确的说明它可以或不可以置换 . 根据您自己的观察结果,排列失败,以及以下文档引用,我将得出结论,它无法完成 .
再说一遍,没有确切的,但是,对我来说,getopt和argparse之间正在形成一个非常尖锐的鸿沟,文档偏向/倡导argparse .
这是一个使用
gnu_getop()
的例子,它满足了你的-z [file [file]]
测试:Edit 1: Go Permute Yourself, with argparse
灵感来自您链接到的“使用Getopt”页面中“permute”的定义,
如何在将arg字符串传递给
parse_args()
之前置换它?滚动你自己:
利用getopt: