我正在尝试将旧的命令行解析器迁移到argparse-module。旧的解析器有一些奇怪之处,其中之一就是选项是通过=
传递的,即
--foo=bar
在argparse中也可以很好地工作。但是我无法映射到argparse功能的一种类型的选项:
--foo
,则选项foo
将获得默认值(我们将其称为bar
)--foo=baz
,则选项foo
将获得值baz
。乍一看,好像
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', nargs='?', const='bar', type=str)
....
会做好这项工作,但是当还有位置自变量时,就会出现问题,例如:
....
parser.add_argument('pos', nargs='+')
现在,以下输入以argparse
失败,但是可以与“旧版”解析器一起使用:
parser.parse_args(['--foo', 'p1'])
因为解析器假定p1
属于foo
,并且不认为它是应属于pos
的位置参数。
是否有一种方法可以调整解析器,以便也用传统解析器foo=bar
和pos=pos1
所做的相同方式来解析上述情况?
有一些测试示例,应该与argparse-solution一起使用(只有最后一个在当前版本中失败):
Input: Expected Output:
----------------- ----------------
['p1', '--foo'] foo=bar, pos=p1
['p1', '--foo=baz'] foo=baz, pos=p1
['p1', '--foo', 'baz'] foo=baz, pos=p1
['--foo=baz', 'p1'] foo=baz, pos=p1
['--foo', 'baz', 'p1'] foo=baz, pos=p1
['p1'] foo=None, pos=p1
['--foo'] error (p1 not provided)
['--foo', 'p1'] foo=bar, pos=p1 (fails with current version)