如何让argparse suparser匹配任何字符串?

时间:2014-08-30 13:11:03

标签: python-2.7 argparse

我正在使用

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")

我想要实现这样的东西:

  1. python myprogram.py add
  2. python myprogram.py edit
  3. python myprogram.py“随机字符串”
  4. 在前两个用例中,我的程序可以根据关键字“add”或“edit”对正确的subparser进行设置。我对最后一种情况很感兴趣,它会映射到我提供的任何随机字符串。

1 个答案:

答案 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时,它会创建一个新的ArgumentParseradd_parser对象),并使用命名键(加上任何别名)将其输入到dict中。解析输入时,argparse会根据此词典的键匹配字符串。因此,要实现理想,您必须更改此字典查找。


另一种选择是在开始时查看sys.argv[1:]。如果您的某个“cmds”存在,请调用parser以获取完整的子分析器操作。否则自己处理输入,或者调用另一个处理“随机字符串”的parser作为普通的位置参数。有时将argparse扭曲成特殊形状是不值得的。