我怎样才能最有效地解析 python 中的这些参数?

How can I most efficiently parse these arguments in python?

所以我正在尝试使用 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')

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

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

program list 

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

program list 10

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

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

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

这个示例让我误入歧途。我在最后勾画了一个子解析器实现,我认为它可以解决问题。

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

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

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


返回到您的初始列表。这些不同的图案你愿意接受吗

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

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

如果是这样,那么 subparsers 可能是最好的选择。 nargs='?' 可用于制作位置参数 'optional'.

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='?')
如果明确给出 none,

valuequality 将获得默认值。默认的 defaultNone。但是您可以定义一个有意义的替代方案,例如default=0 为整数值。


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

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

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