argparse:解析 -h(此处为一些字符串):更改默认行为

argparse: parsing -h(some string here): changing default behavior

当我执行以下操作时:

import argparse

parser = argparse.ArgumentParser()
parser.parse_args(['-ha'])

我得到:

usage: [-h]
error: argument -h/--help: ignored explicit argument 'a'

注: -h 在这里是 运行 用法:[-h].

但我想得到:

error: unrecognized arguments: -ha

没有 运行宁 -h.

我知道这是 argparse 的默认行为,但我需要更改它,我想知道是否有解决方法。

我仍然希望 -h--help 工作。

argparse 缩写形式只有一个字符。

-ah 等价于 -h -a.

如果你想 ha 作为单一参数,你必须使用 --ha

实际上,此行为与“-h”的帮助无关,而是一个带有 0 个参数的标志:

In [1]: import argparse
In [2]: parser = argparse.ArgumentParser()
In [3]: parser.add_argument('-f', action='store_true')

In [4]: parser.parse_args(['-f'])
Out[4]: Namespace(f=True)
In [5]: parser.parse_args(['-fa'])
usage: ipython3 [-h] [-f]
ipython3: error: argument -f: ignored explicit argument 'a'

这个错误是由处理短选项的核心函数引发的。 '-f' 被识别为带有 0 个参数的短可选。所以它不能被解析为'-f a'。由于 '-a' 没有被定义,它不能将它解析为 '-f -a'。

这是定义帮助的明确方法:

 parser = argparse.ArgumentParser(add_help=False)
 parser.add_argument('-h', '--help', action='help')

它的行为与默认值相同,但可以使用不同的标志字符串或不同的 action 进行自定义。编写自定义 action class 比我现在想要的要复杂得多,但是您可以通过查看 argparse.py 中的 _HelpAction subclass 来获得灵感文件。

我打算建议制作它 store_true 并在之后进行帮助处理,但我已经证明 store_true 有一个额外的字符串也有同样的问题。

你可以试试:

In [21]: parser = argparse.ArgumentParser(add_help=False)
In [22]: parser.add_argument('-h', '--help', nargs='?', default=False, const=Tru
    ...: e);
In [23]: parser.parse_args(['-h'])
Out[23]: Namespace(help=True)
In [24]: parser.parse_args([])
Out[24]: Namespace(help=False)
In [25]: parser.parse_args(['-ha'])
Out[25]: Namespace(help='a')
In [26]: parser.parse_args(['-h','a'])
Out[26]: Namespace(help='a')