Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python argparse值范围帮助消息外观_Python_Range_Argparse - Fatal编程技术网

Python argparse值范围帮助消息外观

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.',

我有一个程序的参数,它是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.', 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)