我可以检查给定的参数是否添加(或 "known")到 argparse?

can I check if a given argument is added (or "known") to argparse?

有没有办法检查给定名称的参数是否已添加到 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 某处的字典的键,甚至可能是有意暴露的……但我一直没能找到它们……



背景...

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

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 的每一行都有不同的参数集,headers 列是参数名称。

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

您可以使用 parser._actions.

访问已添加到解析器的参数
[action.dest for action in parser._actions]

这会给你一个列表

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

你的解析器做了一些调整。注意 add_argument returns 一个 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")

Action 的 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 属性。