【问题标题】:How can I most efficiently parse these arguments in python?如何在 python 中最有效地解析这些参数?
【发布时间】:2015-06-30 17:51:06
【问题描述】:

所以我正在尝试使用 argparse 库提出一个策略。

这是我想与我的程序交互的方式:

$ program list [<number>] 
$ program check <name>
$ program watch <name> [<quality>]

现在我有一个参数解析器,如下所示:

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('list')
group.add_argument('check')
group.add_argument('watch')

但是如何向现有参数添加可选参数,比如整数?

意味着用户可以通过以下方式调用 list 命令:

program list 

使用默认值调用列表操作的位置,或者:

program list 10

将使用参数 10 调用列表操作。

我在文档中看到了 subcommands 选项,但我遇到了一个问题,即我有一个用于列表参数的子解析器,但是我必须添加一个标志,例如 -n,然后提供数字。也许这是一种更好的方法?但我喜欢这样的想法,如果你愿意就提供这个数字,或者如果你不想就省略它。

我正在努力实现良好的实践吗? argparse 可以吗?

【问题讨论】:

  • 你看过here了吗?
  • 还有here
  • 我认为他不想同时处理多个子解析器。

标签: python argparse


【解决方案1】:

这个样本让我走错了方向。我在最后绘制了一个子解析器实现,我认为它可以解决问题。

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('list')
group.add_argument('check')
group.add_argument('watch')

它需要 3 个字符串,并将它们分配给 3 个属性。

但是,您不能将 3 个“位置”参数放在一个互斥的组中。一个可选的位置(是的,术语令人困惑)可以在这样的组中,但其余的必须是“可选”(标记)。


回到您的初始列表。您是否愿意接受这些不同的模式

program list [integer]
program check name
program watch name [quality]

其中 'list','check','watch' 是文字字符串,而 'integer','name','quality' 是变量名。

如果是这样,那么 subparsers 可能是最好的选择。 nargs='?' 可用于使位置参数成为“可选”。

parser = argparse.ArgumentParser()
sp = parser.add_subparsers(dest='cmd')  # put the command string in `cmd` attribute
p1 = sp.add_parser('list')
p2 = sp.add_parser('check')
p3 = sp.add_parser('watch')
p1.add_argument('value',dtype=int, nargs='?') # ok with 0 or 1 values
p2.add_argument('name')
p3.add_argument('name')
p3.add_argument('quality',nargs='?')

valuequality 如果没有明确给出默认值。默认defaultNone。但是您可以定义一个有意义的替代方案,例如default=0 为整数值。


您还可以定义一个解析器,如:

parser = ...
parser.add_argument('command', choices=['list','check','watch'])
parser.add_argument('rest', nargs='*')

这将需要 3 个“命令”字符串之一,并将其​​他任何内容放入“其余”属性(作为字符串列表)。然后,您可以根据需要解释这些字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-22
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 2017-08-16
    • 2016-12-08
    • 2018-06-29
    相关资源
    最近更新 更多