我找到了python argparse模块的文档,它提到了formatter_class。我在页面上看不到像width参数或max_help_position这样的内容。那些记录在哪里?
答案 0 :(得分:2)
Argparse使用辅助类argparse.helpformatter(),它使用max_help_position
和width
参数(以及其他参数)。请参阅此优秀答案,说明如何使用Explain lambda argparse.HelpFormatter(prog, width)。
您在查找文档时遇到的问题是因为HelpFormatter仅在名称意义上是公开的。它的所有方法都是私有的。
这取自您提供的文档https://github.com/python/cpython/blob/2.7/Lib/argparse.py中链接的来源:
类HelpFormatter(object):
用于生成使用消息和参数帮助字符串的Formatter。
只有此类的名称才被视为公共API。所有的方法 由班级提供的被视为实施细节。
因此,argparse文档本身是how-to和正式API描述的混合。它主要描述了如何执行常见的解析任务。尽管argparse由类组成,但文档并未正式描述类及其子类和所有方法。它不是参考API。
一种解决方法,就是找到另一个使用HelpFormatter类的服务,该类更好地记录其变量,例如来自Discord https://discordpy.readthedocs.io/en/rewrite/ext/commands/api.html#discord.ext.commands.HelpFormatter的变量。
希望这有帮助。
答案 1 :(得分:1)
argparse
文档更多的常用用法手册,而不是正式的模块文档。例如,它不会列出所有(公共)类及其方法。因此,对于更多自定义用途,您必须查看代码,幸运的是,这只是一个文件argparse.py
。
帮助呼叫序列是:
parser.print_help
parser.format_help
parser._get_formatter
self.formatter_class(prog=self.prog)
在该用途中,仅设置prog
参数;其他值是默认值。
class HelpFormatter(object):
def __init__(self,
prog,
indent_increment=2,
max_help_position=24,
width=None):
所以这些其他参数在__init__
中可用,但用户无法轻易访问。
自定义_get_formatter
方法是自定义这些值的一种方法。另一个是子类HelpFormatter
。也可以使用partial
在formatter_class
参数中设置这些值。
我看到@Magnus已经找到了我之前关于这个主题的答案。
因此,尽管名称,formater_class
参数不必是一个类。在Python duck_typing中,它必须是_get_formatter
可以使用的东西。它可以是prog
参数的任何函数或lambda。
借鉴上一个答案:
f = lambda prog: argparse.HelpFormatter(prog, width=100)
f = functools.partial(argparse.HelpFormatter, width=100)
既可以用作:
parser = argparse.ArgumentParser(formatter_class=f)
让我们看看我是否可以说明argparse
如何使用格式化程序类。
print_usage
使用format_usage
(print_help
相似但更长)
def format_usage(self):
formatter = self._get_formatter()
formatter.add_usage(self.usage, self._actions,
self._mutually_exclusive_groups)
return formatter.format_help()
使用上一个问题的解析器:
In [459]: p.print_usage()
usage: ipython3 [-h] [-f F] [-g [G [G ...]]] [-k [K [K ...]]]
我可以通过直接调用HelpFormatter
类来复制它:
In [460]: f = argparse.HelpFormatter(prog='foo')
In [461]: f.add_usage(p.usage, p._actions,p._mutually_exclusive_groups)
In [462]: print(f.format_help())
usage: foo [-h] [-f F] [-g [G [G ...]]] [-k [K [K ...]]]
如果我创建一个带有width
参数的格式化程序,我会得到一些换行符:
In [463]: f = argparse.HelpFormatter(prog='foo',width=40)
In [464]: f.add_usage(p.usage, p._actions,p._mutually_exclusive_groups)
In [465]: print(f.format_help())
usage: foo [-h] [-f F] [-g [G [G ...]]]
[-k [K [K ...]]]
建议的lambda
(和变体)的目的是将[460]中的默认格式化程序替换为自定义格式化程序。 formatter_class
参数允许我们这样做。它需要比简单width
参数更多的Python知识,但最终会为我们提供更多的自定义功能。