我是否可以检查给定参数是否已添加(或“已知”)到argparse?

2024-09-29 23:20:11 发布

您现在位置:Python中文网/ 问答频道 /正文

是否有方法检查是否已将具有给定名称的参数添加到argparse实例?例如,我希望类似这样的产品能够上市:

argToCheck= 'my_argument'

if (argToCheck in parser.known_arguments):    # "known_arguments" isn't a thing, but it should be?
    # do some magic
else:
    # do some different magic

我强烈怀疑所有添加的参数都是隐藏在argparse中某个地方的dict的键,甚至可能是故意公开的dict的键。。。但我一直没能找到他们



背景

我有一个argparse解析器,它定义了大约12个可选参数:

def jumpParser():
    parser = argparse.ArgumentParser()
    parser.add_argument("-i",   "--input_file", action="store", type=str, required=True, help="input video file")
    parser.add_argument("-o",   "--output_file", action="store", type=str, required=True,  help="output video file")
    parser.add_argument("-s",   "--stamp", action="store_true",  help="enable frame stamping")
    # and so on...
    return parser

另外,我还有一些代码,可以解析excel工作表来调用一个函数,每行XLS都有一组不同的参数,列标题是参数名

理想情况下,我希望用户能够拥有一些列,这些列的标题不是特定解析器严格已知的参数,因此它只跳过这些列,并使用特定解析器已知的该行参数调用函数


Tags: storeaddparser解析器参数argparsehelpaction
2条回答

您可以使用parser._actions访问已添加到解析器的参数

[action.dest for action in parser._actions]

这将为您提供一个

['help', 'input_file', 'output_file', 'stamp']

只需对解析器进行一些调整。请注意add_argument返回一个Action对象,可以忽略该对象,也可以将其赋值给变量:

In [19]: import argparse
In [20]: parser = argparse.ArgumentParser()
    ...: a1 = parser.add_argument("-i",   " input_file", action="store", type=str, help="input video file")
    ...: a2 = parser.add_argument("-o",   " output_file", action="store", type=str, help="output video file")
    ...: a3 = parser.add_argument("-s",   " stamp", action="store_true",  help="enable frame stamping")
    ...: a4 = parser.add_argument("foobar")

动作的repr是什么样子的。这些是主要属性,但不是全部

In [21]: a1
Out[21]: _StoreAction(option_strings=['-i', ' input_file'], dest='input_file', nargs=None, const=None, default=None, type=<class 'str'>, choices=None, help='input video file', metavar=None)
In [22]: a3
Out[22]: _StoreTrueAction(option_strings=['-s', ' stamp'], dest='stamp', nargs=0, const=True, default=False, type=None, choices=None, help='enable frame stamping', metavar=None)
In [23]: a4
Out[23]: _StoreAction(option_strings=[], dest='foobar', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)

解析器本身是一个对象,具有方法和属性

In [24]: parser._actions
Out[24]: 
[_HelpAction(option_strings=['-h', ' help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None),
 _StoreAction(option_strings=['-i', ' input_file'], dest='input_file', nargs=None, const=None, default=None, type=<class 'str'>, choices=None, help='input video file', metavar=None),
 _StoreAction(option_strings=['-o', ' output_file'], dest='output_file', nargs=None, const=None, default=None, type=<class 'str'>, choices=None, help='output video file', metavar=None),
 _StoreTrueAction(option_strings=['-s', ' stamp'], dest='stamp', nargs=0, const=True, default=False, type=None, choices=None, help='enable frame stamping', metavar=None),
 _StoreAction(option_strings=[], dest='foobar', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)]

我们可以使用适当的字符串列表测试解析器,模拟通过命令行提交的值

In [25]: args = parser.parse_args([])
usage: ipython3 [-h] [-i INPUT_FILE] [-o OUTPUT_FILE] [-s] foobar
ipython3: error: the following arguments are required: foobar
An exception has occurred, use %tb to see the full traceback.
SystemExit: 2

如果有足够的必需参数,结果Namespace将显示所有已定义的参数(除非某些参数是SUPRESSED):

In [26]: args = parser.parse_args(['xxx'])
In [27]: args
Out[27]: Namespace(foobar='xxx', input_file=None, output_file=None, stamp=False)

我们可以把这个名称空间对象看作一个字典,例如

In [28]: vars(args)
Out[28]: {'input_file': None, 'output_file': None, 'stamp': False, 'foobar': 'xxx'}
In [29]: list(vars(args).keys())
Out[29]: ['input_file', 'output_file', 'stamp', 'foobar']

这些键对应于参数dest属性

相关问题 更多 >

    热门问题