在argparse中存在位置参数的情况下,如何通过=正确传递可选参数?

时间:2019-08-14 14:41:33

标签: python argparse

我正在尝试将旧的命令行解析器迁移到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=barpos=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)

0 个答案:

没有答案