【问题标题】:Python argparse optional dash-integer argumentPython argparse 可选破折号整数参数
【发布时间】:2021-05-06 04:16:02
【问题描述】:

是否可以使用 argparse 添加可选参数为 -,

类似于 unix head 和 tail 命令,它们接受 - 来表示要打印多少行,
或类似于git log 接受 - 来说明要打印多少日志条目?

例如,

head -4     # print four lines
tail -12    # print 12 lines.
git log -7  # print 7 log entries

而参数 是可选的,例如这些都可以:

head        # print default number of lines
tail        # print default number of lines
git log     # print all log entries through system pager

在 Python 中是否有通用和/或公认的方法来执行此操作?

谢谢。

【问题讨论】:

  • 为什么是 '-4' 而不仅仅是 '4'(假设你不是指负整数)?
  • @hpaulj -- 不,不是负整数。 ... dash 因为它是一个选项。如上面的问题所示,这个想法是遵循其他命令已经建立的相同约定(“head”、“tail”、“git log”、“kill”,仅举几个接受 作为一个选项)。

标签: python python-3.x argparse


【解决方案1】:

argparse 不支持动态选项名称。

来源:我试着做你问的同样的事情。

您可以自己完成任务,但它必须在argparse 之前或之后运行,并且必须修改sys.argv。这使得解决方案的一半将回避argparse。我建议您尝试找到支持这种参数传递方式的库。

【讨论】:

    【解决方案2】:

    试图接受破折号作为参数标志会产生歧义。何时应将它们解释为负数,何时应将其解释为标志?此外argparse 不允许“动态”或模式;你已经定义了每个标志。

    通常 '-2' 被解析为一个值 - 如果类型是 int,则为数字:

    In [250]: p=argparse.ArgumentParser()
    In [251]: p.add_argument('foo', type=int);
    In [252]: p.parse_args(['-2'])
    Out[252]: Namespace(foo=-2)
    

    我们可以用数字字符定义一个标志:

    In [253]: p.add_argument('-3','--third');
    In [254]: p.parse_args(['2'])
    Out[254]: Namespace(foo=2, third=None)
    

    禁止使用负数:

    In [255]: p.parse_args(['-2'])
    usage: ipython3 [-h] [-3 THIRD] foo
    ipython3: error: the following arguments are required: foo
    
    In [257]: p.parse_args('-3 xxx 3'.split())
    Out[257]: Namespace(foo=3, third='xxx')
    
    In [260]: p.parse_args('-3 -1 3'.split())
    usage: ipython3 [-h] [-3 THIRD] foo
    ipython3: error: argument -3/--third: expected one argument
    

    根据 gnu-unix/linux 你想要的模式已经过时了

    https://www.gnu.org/software/coreutils/manual/html_node/head-invocation.html

    通常用以下方式指定行:

    ‘-n [-]num’
    

    负值从末尾开始计数(就像 Python 中的负切片一样)。

    For compatibility head also supports an obsolete option syntax -[num][bkm][cqv]
    

    像这样的早期版本的实用程序直接(在 C 代码中)使用作者认为方便的任何语法(从编码的角度来看最终用法)解析命令行值。您也可以按照其他答案中的说明进行操作。但随着系统的成熟,开发人员使用 getopt 之类的解析器,并尝试标准化使用。
    https://www.gnu.org/software/coreutils/manual/html_node/Common-options.html#Common-options

    通常argparse 建立在通过getopt 和optparse 模块继承的POSIX 标准之上。

    【讨论】:

      猜你喜欢
      • 2012-07-03
      • 2019-03-09
      • 2018-04-22
      • 2020-11-25
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      相关资源
      最近更新 更多