【问题标题】:How can i make argparse suparser match any string?我怎样才能使 argparse suparser 匹配任何字符串?
【发布时间】:2014-10-24 07:39:01
【问题描述】:

我正在使用

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 添加
  2. python myprogram.py 编辑
  3. python myprogram.py "随机字符串"

在前两个用例中,我的程序可以根据关键字“add”或“edit”分配正确的子解析器。我对最后一种情况感兴趣,它映射到我提供的任何随机字符串。

【问题讨论】:

  • 如果您将代码格式化为代码会有所帮助。为此,请选择所有代码并按 Ctrl-K

标签: python-2.7 argparse


【解决方案1】:

没有直接的方法可以做到这一点。子解析器的使用是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 对象),并使用命名键(以及任何别名)将其输入到字典中。在解析您的输入时,argparse 将字符串与该字典的键进行匹配。因此,要实现您的理想,您必须更改此字典查找。


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    相关资源
    最近更新 更多