如何最有效地解析python中的这些参数?

问题描述:

所以我试图想出一个使用argparse库的策略。如何最有效地解析python中的这些参数?

以下是我想和我的程序接口:

$ 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的参数。

我看到了文档中的子命令选项,但我遇到了问题,我将有一个列表参数的子解析器,但是我必须添加一个标志,例如-n,然后提供数字。也许这是一个更好的方法呢?但是我喜欢只提供号码的想法,如果你不想的话,或者省略它。

我试图达到良好的做法吗? argparse可能吗?

+0

你看了[这里](http://*.com/questions/4575747/get-selected-subcommand-with-argparse)呢? –

+0

和[这里](http://*.com/questions/10448200/how-to-parse-multiple-sub-commands-using-python-argparse)。 –

+0

我不认为他想要一次处理多个子分析器。 – hpaulj

这个例子让我错误的方向。我在最后草拟了一个subparser实现,我认为这是个窍门。

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] 

其中“名单”,“检查”,“看”是文字字符串,而“整”,“名”,“质量”是变量名。

如果是这样的话,那么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“命令”字符串中的一个,并把什么都在“休息”属性(如字符串列表)。然后,您可以根据需要解释这些字符串。

+0

这是完美的谢谢。学到了一些新的东西。 –