繁体   English   中英

如何保留自动添加的 argparse 帮助参数,但从中删除 -h,以便我可以将该选项用于另一个参数

[英]How to keep the automatically added argparse help argument, but remove -h from it so I can use that option for another argument

自动添加的帮助参数具有选项字符串-h--help 我想保留--help的帮助参数,但从中删除-h ,因此我可以将该选项字符串用于另一个参数。

我认为必须有比使用add_help=False完全删除帮助参数更好的方法,只是在之后立即使用--helpaction="help"再次添加它,对吧? 也许我可以修改现有的帮助参数的选项字符串?


顺便说一下,关于“不要删除-h因为用户希望它是--help的别名”:这是一个公平的论点。 但是,在快速浏览我的本地二进制文件时,我找不到任何使用-h来显示除fdisk之外的帮助消息的命令。 (当然,这并不意味着没有更多。)甚至更多:许多命令使用-h来表示完全不同的东西,请参阅lscddfdiff来命名其中的一些。

冲突处理程序路由:

In [5]: parser=argparse.ArgumentParser(conflict_handler='resolve')                             
In [6]: parser.add_argument('-h','--handle',help='handle foobar',default='foo');               

In [7]: parser.print_help()                                                                    
usage: ipython3 [--help] [-h HANDLE]

optional arguments:
  --help                show this help message and exit
  -h HANDLE, --handle HANDLE
                        handle foobar

resolve只是改变了'-h',而不是'--help'。

使用新的“-h”:

In [8]: parser.parse_args('-h bar'.split())                                                    
Out[8]: Namespace(handle='bar')

由于仍然允许使用缩写,因此带一个破折号的“-help”会产生意想不到的结果:

In [9]: parser.parse_args('-help'.split())                                                     
Out[9]: Namespace(handle='elp')

正确的帮助:

In [10]: parser.parse_args('--help'.split())                                                   
usage: ipython3 [--help] [-h HANDLE]

optional arguments:
  --help                show this help message and exit
  -h HANDLE, --handle HANDLE
                        handle foobar
An exception has occurred, use %tb to see the full traceback.

SystemExit: 0

/usr/local/lib/python3.6/dist-packages/IPython/core/interactiveshell.py:3327: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
  warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

查看_handle_conflict_resolve方法的代码,看看它到底做了什么。

也许我可以修改现有的帮助参数的选项字符串?

只是提一下,修改现有参数的非常hacky的方式:

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.print_help()
usage: [-h]

optional arguments:
  -h, --help  show this help message and exit
>>> parser._actions[0].option_strings.remove("-h")
>>> parser._option_string_actions.pop("-h")
_HelpAction(option_strings=['--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None)
>>> parser.print_help()
usage: [--help]

optional arguments:
  --help  show this help message and exit

顺便说一句,而不是

parser._actions[0].option_strings.remove("-h")
parser._option_string_actions.pop("-h")

您还可以使用_handle_conflict_resolve

parser._handle_conflict_resolve(None, [("-h", parser._actions[0])])

我认为必须有更好的方法,而不是用add_help=False完全删除帮助参数, add_help=False立即使用--helpaction="help"再次添加它

为了完整起见,这是如何工作的:

>>> from argparse import ArgumentParser, SUPPRESS
>>> parser = ArgumentParser(add_help=False)
>>> parser.add_argument("--help", action="help", default=SUPPRESS, help="show this help message and exit")
_HelpAction(option_strings=['--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None)
>>> parser.print_help()
usage: [--help]

optional arguments:
  --help  show this help message and exit

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM