我同意这看起来完全像一个子解析器问题,并且如果您不想通过使用--all
and使其成为可选参数--name
,我的一个建议就是完全忽略all
andname
并使用以下语义:
- 如果
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
命名空间(进程=[])
$ python tester.py proc1
命名空间(进程=['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 名称
用法:argparse_test.py [-h] [进程[进程...]]
argparse_test.py:错误:参数进程:请指定至少一个进程名称
$ python argparse_test.py 名称 proc1
命名空间(名称=['proc1'],进程=无)
$ python argparse_test.py 全部
命名空间(全部=真,进程=无)
$ python argparse_test.py 主机
用法:argparse_test.py [-h] [进程[进程...]]
argparse_test.py:错误:参数过程:只应指定“全部”或“名称”
$蟒蛇argparse_test.py
用法:argparse_test.py [-h] [进程[进程...]]
argparse_test.py:错误:参数过程:参数太少