我正在使用
parser = argparse.ArgumentParser()
subparser = parser.add_subparsers()
add_parser = subparsers.add_parser("add", help="Add parser")
add_parser.add_argument("-project", default="global")
edit_parser = subparsers.add_parser("edit", help="Edit parser")
我想要实现这样的东西:
在前两个用例中,我的程序可以根据关键字“add”或“edit”对正确的subparser进行设置。我对最后一种情况很感兴趣,它会映射到我提供的任何随机字符串。
答案 0 :(得分:0)
没有直接的方法可以做到这一点。 subparsers的使用是positional
choices
参数的扩展。
parser.add_argument('cmd', choices=['add', 'edit', ...])
如果是in choices
,则接受字符串。没有内置模式匹配机制。
我认为您最简单的解决方案是添加一个步骤:
custom = subparser.add_parser('custom', help='give a random string')
custom.add_argument('anystring', help='random quoted string')
python myprogram.py custom 'any random string'
我可以想象编写一个可以进行两种匹配的自定义choices
类。它需要一个自定义__contains__
方法(可能还有一个新的__iter__
列出帮助中的选项)。但是将其纳入_SubParsersAction
类需要一些严格的编码。
更多细节。您的subparser
对象是_SubParsersAction
。其choices
属性是OrderedDict。当您add_parser
时,它会创建一个新的ArgumentParser
(add_parser
对象),并使用命名键(加上任何别名)将其输入到dict中。解析输入时,argparse
会根据此词典的键匹配字符串。因此,要实现理想,您必须更改此字典查找。
另一种选择是在开始时查看sys.argv[1:]
。如果您的某个“cmds”存在,请调用parser
以获取完整的子分析器操作。否则自己处理输入,或者调用另一个处理“随机字符串”的parser
作为普通的位置参数。有时将argparse
扭曲成特殊形状是不值得的。