如何在可选位置参数之前定义可选参数值?

时间:2017-04-24 14:17:02

标签: python argparse

回到最初设定的问题 Python; argparse; how to specify position of positional arguments,我进入了一个有效的用例,回答了为什么需要这样做的问题。

如果你有一个带有可选值的参数和一个可选的位置参数,这个参数可以用于argparse,例如,来自help:

$ myprog.py --help
usage: playargs.py [-h] [-i [I]] [positional [positional ...]]
-----cropped-----

然后,设置'-i'标志而没有值'I'并获得位置值的唯一方法是将'-i'标志放在最后。所以,如果你写的话

$ myprog.py -i one two three

'one'值不可避免地变为'-i'。如果你想把所有'一','两'和'三'作为定位,那么唯一的办法就是写

$ myprog.py one two three -i

我认为应该有一种方法可以将接受的语法限制为:

playargs.py [positional [positional ...]] [-i [I]]

在可选位置参数之前,值'I'的可选性会使事情变得不清楚。

有没有办法使用argparse或其他模块?

1 个答案:

答案 0 :(得分:1)

关联的问题是关于usage格式化。作为惯例,位置移动到列表的末尾,反映了常见的POSIX命令行实践:

prog [optionals] infile outfile

它不反映如何接受或解析参数。

argparse,按照设计,试图与订单无关。虽然定位器是在它们之间进行排序的,但是选项可以以任何顺序发生,甚至可以在定位之间发生。基本的解析循环是:

loop:
    handle positionals (up to next optionals flag)
    handle a optional
handle remaining positionals

另一个特点是nargs贪婪。您的 '?'对于-i,如果可用则需要1个参数,即使它没有满足。它实际上使用re(正则表达式)模式匹配。

argparse中没有任何机制可以说-i必须在结尾或定位后发生。这需要改变基本的解析循环。

另一个可选项或“ - ”是终止变长nargs的唯一工具。

prog -i -- 1 2 3
prog -i -f 1 2 3   # -f is another argument
prog 1 2 3 -i 4

optparse有不同的解析策略。我对它并不熟悉,但我相信它会将整个argv传递给一个选项,让它使用它想要的东西,然后继续解析其余部分。 positionals只是未解析的字符串(argparse extras的{​​{1}})。

有一些旧的解析器,以旧的UNIX实践为蓝本。有一大堆第三方解析器。当然,您可以直接处理parse_known_args