回到最初设定的问题 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或其他模块?
答案 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
。