Python argparse:parsing-h(这里有一些字符串):更改默认行为

Python argparse:parsing-h(这里有一些字符串):更改默认行为,python,argparse,Python,Argparse,当我执行以下操作时: 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 我知道这是argpar

当我执行以下操作时:

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个参数的短可选值。所以它不能被解析为'-fa'。由于还没有定义'-a',所以不能将其解析为'-f-a'

以下是定义帮助的明确方式:

 parser = argparse.ArgumentParser(add_help=False)
 parser.add_argument('-h', '--help', action='help')
其行为与默认值相同,但可以使用不同的标志字符串或不同的
操作进行自定义。编写一个自定义的
action
类比我现在想做的要复杂得多,但是您可以通过查看
argparse.py
文件中的
\u HelpAction
子类来获得想法

我本打算建议将其设置为
store\u true
并在之后进行帮助处理,但我已经说明了
store\u 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')

默认的'-h'显示帮助和退出。它不会继续或使用任何其他参数。“a”应该做什么?另外,默认行为(已建立)是将单字符标志视为“可链”。如果使用
add\u help=False
可以设置自己的帮助参数。@hpaulj我如何设置新的帮助参数?你能给我一份推荐信吗?这似乎是解决我的问题的唯一方法:不使用-h/--help并手动设置它们,这样它们就不会遵循默认行为。在这种情况下,-h将不再是对--help的模糊缩写,但我不认为有一个合乎逻辑的解决方案,'-ha'不是对'--help'的缩写。所以我想我在这里做的是图书馆本身的反传统?我说的对吗?是的,如果你想把
ha
作为一个整体来对待是的,我也试过了!它提供了相同的默认行为,编写自定义操作不是直接操作吗?@hapulj非常感谢,最后一个操作非常有效,我将-h读为False,如果提供了,我将检查它是否单独存在,并相应地进行操作。@hapulj在指定-nargs时,用法消息与默认值不同,例如,如果nargs=“?”,用法消息将是-h[metafvar],如果nargs=“*”,用法消息将是-h[metavar[metavar[…]]。虽然它起作用了,但在别的地方坏了