【问题标题】:How to define optional argument value before optional positional argument?如何在可选位置参数之前定义可选参数值?
【发布时间】:2017-04-24 14:17:02
【问题描述】:

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

如果你有一个带有可选值的参数和一个可选的位置参数,这可以通过 argparse 实现,例如,来自帮助:

$ 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 或其他模块有什么办法吗?

【问题讨论】:

  • 只是为了确保:您的问题只是关于帮助文本的格式?
  • 不,这是关于实现行为(我希望在此帮助文本中描述)

标签: python argparse


【解决方案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 parse_known_argsextras)。

有几个旧的解析器,模仿旧的 UNIX 实践。有大量的第三方解析器。当然你也可以直接处理sys.argv

【讨论】:

  • 谢谢,'--' 工具很有用。我认为这可以解决问题。
猜你喜欢
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
  • 2020-11-10
  • 2019-04-13
  • 2011-05-27
相关资源
最近更新 更多