我同意这看起来就像是一个子分析器问题,并且如果你不想通过使用来使它成为可选参数和--name
,从我一个建议是只是忽略all
和name
干脆,并使用以下语义:
- 如果
tester.py
被称为不带任何参数,停止所有进程。
- 如果用某些参数调用
tester.py
,请仅停止这些进程。
这是可以做到用:
import argparse, sys
parser = argparse.ArgumentParser()
parser.add_argument('processes', nargs='*')
parsed = parser.parse(sys.argv[1:])
print parsed
这将表现为如下:
$ python tester.py
Namespace(processes=[])
$ python tester.py proc1
Namespace(processes=['proc1'])
或者,如果你坚持你自己的语法,你可以创建一个自定义类。实际上,您没有“互斥组”的情况,因为我假设指定all
,您将忽略其余参数(即使name
是其他参数之一),并且指定name
时,任何内容否则之后将被视为进程的名称。
import argparse
import sys
class AllOrName(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
if len(values)==0:
raise argparse.ArgumentError(self, 'too few arguments')
if values[0]=='all':
setattr(namespace, 'all', True)
elif values[0]=='name':
if len(values)==1:
raise argparse.ArgumentError(self, 'please specify at least one process name')
setattr(namespace, 'name', values[1:])
else:
raise argparse.ArgumentError(self, 'only "all" or "name" should be specified')
parser = argparse.ArgumentParser()
parser.add_argument('processes', nargs='*', action=AllOrName)
parsed = parser.parse_args(sys.argv[1:])
print parsed
有以下行为:
$ python argparse_test.py name
usage: argparse_test.py [-h] [processes [processes ...]]
argparse_test.py: error: argument processes: please specify at least one process name
$ python argparse_test.py name proc1
Namespace(name=['proc1'], processes=None)
$ python argparse_test.py all
Namespace(all=True, processes=None)
$ python argparse_test.py host
usage: argparse_test.py [-h] [processes [processes ...]]
argparse_test.py: error: argument processes: only "all" or "name" should be specified
$ python argparse_test.py
usage: argparse_test.py [-h] [processes [processes ...]]
argparse_test.py: error: argument processes: too few arguments
为什么你想避免SUP解析器?这看起来完全像一个子分析器问题! – 2013-03-20 17:06:51
他们已经在suparsers上运作。我想保持它浅薄......但如果没有其他解决方案,我会在两个层次上与子分析器一起尝试。 – Alex 2013-03-20 17:07:44
将'all'改为'--all'和'name'为'--name'。 – hughdbrown 2013-03-20 17:48:27