Python argparse值范围帮助消息外观
我有一个程序的参数,它是1-100之间的整数,我只是不喜欢它在使用argparse时显示在-h帮助消息中的方式(它字面上列出了0、1、2、3、4、5等等) 有没有办法改变这一点,或者用另一种方式来表示 谢谢 编辑: 以下是询问者的代码:Python argparse值范围帮助消息外观,python,range,argparse,Python,Range,Argparse,我有一个程序的参数,它是1-100之间的整数,我只是不喜欢它在使用argparse时显示在-h帮助消息中的方式(它字面上列出了0、1、2、3、4、5等等) 有没有办法改变这一点,或者用另一种方式来表示 谢谢 编辑: 以下是询问者的代码: norse = parser.add_argument_group('Norse') norse.add_argument('-n', '--norse', required=False, help='Run the Norse IPViking scan.',
norse = parser.add_argument_group('Norse')
norse.add_argument('-n', '--norse', required=False, help='Run the Norse IPViking scan.', action='store_true')
norse.add_argument('--threshold', required=False, type=int, choices=range(0,101), help='Threshold (0-100) denoting at what threat level to provide additional data on an IP \
address. Default is 49.', default=49)
使用添加参数()
例如:
norse = parser.add_argument_group('Norse')
norse.add_argument('-n', '--norse', required=False, help='Run the Norse IPViking scan.', action='store_true')
norse.add_argument('--threshold', required=False, type=int, choices=range(0,101),
metavar="[0-100]",
help='Threshold (0-100) denoting at what threat level to provide additional data on an IP \
address. Default is 49.', default=49)
测试:
结果
usage: -c [-h] [-n] [--threshold [0-100]]
optional arguments:
-h, --help show this help message and exit
-n, --norse Run the Norse IPViking scan.
--threshold [0-100] Threshold (0-100) denoting at what threat level to
provide additional data on an IP address. Default is
49.
这里有几种方法可以替代
def parseCommandArgs():
parser = argparse.ArgumentParser()
parser.add_argument('-i', dest='myDest', choices=range(1,101), type=int, required=True, metavar='INT[1,100]', help='my help message')
return parser.parse_args()
您也可以改为使用操作
,我强烈建议您这样做,因为它允许更多的定制
def verify():
class Validity(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
if values < 1 or values > 100:
# do something
pass
return Validity
def parseCommandArgs():
parser = argparse.ArgumentParser()
parser.add_argument('-i', dest='myDest', required=True, metavar='INT[1,100]', help='my help message', action=verify())
return parser.parse_args()
def verify():
类有效性(argparse.Action):
def uu调用(self、解析器、命名空间、值、选项u string=None):
如果值<1或值>100:
#做点什么
通过
返回有效期
def parseCommandArgs():
parser=argparse.ArgumentParser()
parser.add_参数('-i',dest='myDest',required=True,metavar='INT[1100]',help='my help message',action=verify())
返回parser.parse_args()
您可以自定义操作,例如:
#!/usr/bin/env python
import argparse
class Range(argparse.Action):
def __init__(self, minimum=None, maximum=None, *args, **kwargs):
self.min = minimum
self.max = maximum
kwargs["metavar"] = "[%d-%d]" % (self.min, self.max)
super(Range, self).__init__(*args, **kwargs)
def __call__(self, parser, namespace, value, option_string=None):
if not (self.min <= value <= self.max):
msg = 'invalid choice: %r (choose from [%d-%d])' % \
(value, self.min, self.max)
raise argparse.ArgumentError(self, msg)
setattr(namespace, self.dest, value)
norse = argparse.ArgumentParser('Norse')
norse.add_argument('--threshold', required=False, type=int, min=0, max=100,
action=Range,
help='Threshold [%(min)d-%(max)d] denoting at what threat \
level to provide additional data on an IP address. \
Default is %(default)s.', default=49)
args = norse.parse_args()
print args
使用自定义的类型
,更容易控制错误消息(通过参数类型错误
)。我仍然需要metavar
来控制使用情况显示
import argparse
def range_type(astr, min=0, max=101):
value = int(astr)
if min<= value <= max:
return value
else:
raise argparse.ArgumentTypeError('value not in range %s-%s'%(min,max))
parser = argparse.ArgumentParser()
norse = parser.add_argument_group('Norse')
...
norse.add_argument('--range', type=range_type,
help='Value in range: Default is %(default)s.',
default=49, metavar='[0-101]')
parser.print_help()
print parser.parse_args()
我可以使用functools.partial
自定义范围值:
type=partial(range_type, min=10, max=90)
你能发布你的代码示例吗?API没有任何建议,可能不是使用选项,你可以实现自己的检查。你可以尝试查看argparse.ArgumentDefaultsHelpFormatter,我自己没有使用过它,但它可能会提供您需要的定制。是的,我想简单地放弃内置检查并运行我自己的,但如果我能将其保持在argparse内,那就太好了。。。好吧。metavar
适用于用法
和帮助
。这对错误消息没有帮助。更多信息请访问和@hpaulj,谢谢您的参考。知道这一点很有意思。我会自定义类型
,而不是操作
。
import argparse
def range_type(astr, min=0, max=101):
value = int(astr)
if min<= value <= max:
return value
else:
raise argparse.ArgumentTypeError('value not in range %s-%s'%(min,max))
parser = argparse.ArgumentParser()
norse = parser.add_argument_group('Norse')
...
norse.add_argument('--range', type=range_type,
help='Value in range: Default is %(default)s.',
default=49, metavar='[0-101]')
parser.print_help()
print parser.parse_args()
2244:~/mypy$ python2.7 stack25295487.py --ran 102
usage: stack25295487.py [-h] [-n] [--threshold [0:101]] [--range [0-101]]
optional arguments:
-h, --help show this help message and exit
Norse:
...
--range [0-101] Value in range: Default is 49.
usage: stack25295487.py [-h] [-n] [--threshold [0:101]] [--range [0-101]]
stack25295487.py: error: argument --range: value not in range 0-101
type=partial(range_type, min=10, max=90)