【问题标题】:handling invalid and empty arguments while using optional argparse arguments在使用可选的 argparse 参数时处理无效和空参数
【发布时间】:2022-06-11 01:09:59
【问题描述】:

下面是一个使用argparse的示例代码

import os
import numpy
import argparse

def main():
    parser = argparse.ArgumentParser() 
    parser.add_argument('-C','--Chk',type=str, help='Choose arg')
    parser.add_argument('-R','--ReC',type=str, help='Choose arg')
    args = vars(parser.parse_args())
 
    if args['Chk'] == 'compo1':
        print('This is comp1')
    elif args['Chk'] == 'compo2':
        print('This is comp2')
    else:
        print('The specified comp does not exist')
    
    if args['ReC'] == 'recompo':
        print('This is second test')
    else:
        print('The specified second_T does not exist')

     
if __name__=='__main__':
    main()

上面的代码工作正常。既然都是optional arguments,我想有两个特点:

  1. 如果给出了无效的参数,对于-C-R,我想打印/提出一条消息。我尝试使用raise argparse.ArgumentTypeError,见下文。
if len(args) > 8 or len(args) < 3:
        raise argparse.ArgumentTypeError('Print this error message')
        return
  1. 其次,如果没有给出-C-R 中的任何一个,我希望代码不应该执行任何操作。在上面的代码中,如果在任何一种情况下都没有给出参数,它会打印The specified comp does not exist,这并不理想。

有没有更好的方法来完成上述任务?谢谢

【问题讨论】:

  • args 是一个 dict 有 2 个项目。 len 测试有什么用?
  • @hpaulj 如果在执行过程中给出的字符串错误,我想打印一条消息。因此,考虑使用len(str) 长度作为标准。应该是len(args['Chk'])
  • 如果有一小部分允许的字符串,您可以使用choicestype 函数也可用于测试允许值。

标签: python conditional-statements argparse


【解决方案1】:

对于错误处理,你可以这样检查:

class ArgumentParserError(Exception): pass
class ThrowingArgumentParser(argparse.ArgumentParser):
    def error(self, message):
        raise ArgumentParserError(message)

这也许对你有一些帮助:

parser = ThrowingArgumentParser(description="YOUR DESCRIPTION")
parser.add_argument('func', nargs='?', choices=['C','R'], const='')

【讨论】:

  • 你为什么建议使用位置参数?是因为在执行期间至少有一个可选参数吗?
【解决方案2】:

如果您使用choicesargparse 将测试一组特定的值:

In [44]: parser = argparse.ArgumentParser()
    ...: parser.add_argument('-C','--Chk',choices=['compo1','compo2'], help='Choose arg', default='foobar')
    ...: parser.add_argument('-R','--ReC',choices=['recompo'], help='Choose arg', default='xxx');

可接受:

In [45]: parser.parse_args('-C compo1 -R recompo'.split())
Out[45]: Namespace(Chk='compo1', ReC='recompo')

默认值 - 我指定了一些字符串;默认默认为无:

In [46]: parser.parse_args([])
Out[46]: Namespace(Chk='foobar', ReC='xxx')

选择错误会引发使用错误并退出:

In [47]: parser.parse_args('-C compo1 -R recomp1'.split())
usage: ipykernel_launcher.py [-h] [-C {compo1,compo2}] [-R {recompo}]
ipykernel_launcher.py: error: argument -R/--ReC: invalid choice: 'recomp1' (choose from 'recompo')

如果您想限制字符串长度,可以改用type 函数。

否则,最好对值进行解析后测试,即使逻辑看起来有点混乱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-14
    • 2014-09-09
    • 1970-01-01
    • 2017-11-26
    • 2021-09-05
    • 2015-11-07
    • 2019-07-12
    • 2012-05-27
    相关资源
    最近更新 更多