如何在可选位置参数之前定义可选参数值?
How to define optional argument value before optional positional argument?
回到最初由
,我遇到了一个有效的用例,回答了为什么需要这样做的问题。
如果你有一个带有可选值的参数和一个可选的位置参数,这可以用 argparse 实现,例如,来自帮助:
$ myprog.py --help
usage: playargs.py [-h] [-i [I]] [positional [positional ...]]
-----cropped-----
然后设置'-i'标志没有值的唯一方法'I'并获得位置值,是将'-i'标志放在最后。所以,如果你写
$ myprog.py -i one two three
'one' 值不可避免地变为“-i”。如果你想把所有的 'one', 'two' 和 'three' 作为位置,那么唯一的方法就是写
$ myprog.py one two three -i
我认为应该有一种方法可以将接受的语法限制为:
playargs.py [positional [positional ...]] [-i [I]]
值 'I' 在可选位置参数之前的可选性使事情变得不清楚。
有没有 argparse 或其他模块的方法?
链接的问题是关于 usage
格式的。作为惯例,位置被移到列表的末尾,反映了常见的 POSIX 命令行实践:
prog [optionals] infile outfile
它不反映参数是如何被接受或解析的。
argparse
在设计上试图与顺序无关。虽然位置在它们之间是有序的,但可选值可以以任何顺序出现,甚至可以在位置之间出现。基本的解析循环是:
loop:
handle positionals (up to next optionals flag)
handle a optional
handle remaining positionals
另一个特征是 nargs
是贪婪的。您的 '?' for -i
接受 1 个参数(如果可用),即使它满足 none。它实际上使用 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 parse_known_args
的 extras
)。
有几个旧的解析器,它们以旧的 UNIX 实践为模型。有大量的第三方解析器。当然你也可以直接处理sys.argv
。
回到最初由
如果你有一个带有可选值的参数和一个可选的位置参数,这可以用 argparse 实现,例如,来自帮助:
$ myprog.py --help
usage: playargs.py [-h] [-i [I]] [positional [positional ...]]
-----cropped-----
然后设置'-i'标志没有值的唯一方法'I'并获得位置值,是将'-i'标志放在最后。所以,如果你写
$ myprog.py -i one two three
'one' 值不可避免地变为“-i”。如果你想把所有的 'one', 'two' 和 'three' 作为位置,那么唯一的方法就是写
$ myprog.py one two three -i
我认为应该有一种方法可以将接受的语法限制为:
playargs.py [positional [positional ...]] [-i [I]]
值 'I' 在可选位置参数之前的可选性使事情变得不清楚。
有没有 argparse 或其他模块的方法?
链接的问题是关于 usage
格式的。作为惯例,位置被移到列表的末尾,反映了常见的 POSIX 命令行实践:
prog [optionals] infile outfile
它不反映参数是如何被接受或解析的。
argparse
在设计上试图与顺序无关。虽然位置在它们之间是有序的,但可选值可以以任何顺序出现,甚至可以在位置之间出现。基本的解析循环是:
loop:
handle positionals (up to next optionals flag)
handle a optional
handle remaining positionals
另一个特征是 nargs
是贪婪的。您的 '?' for -i
接受 1 个参数(如果可用),即使它满足 none。它实际上使用 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 parse_known_args
的 extras
)。
有几个旧的解析器,它们以旧的 UNIX 实践为模型。有大量的第三方解析器。当然你也可以直接处理sys.argv
。