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 问题,但似乎没有人回答这个问题:Can argparse be made to permute argument order like getopt?
用例是一个原型命令行签名,如 GNU 排序:
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 上面)。
- p.add_argument('files',nargs=argparse.REMAINDER) -- 选项 -z 包含在文件中,除非在位置参数之前
- p.add_argument('files',nargs='*',action='append');
我想实现一些接近上面的 GNU 排序原型的东西。我对可以为每个文件指定的标志不感兴趣(例如,-f file1 -f file2)。