python argparse helpformatter类的文档在哪里?

时间:2018-03-14 00:19:12

标签: python argparse

我找到了python argparse模块的文档,它提到了formatter_class。我在页面上看不到像width参数或max_help_position这样的内容。那些记录在哪里?

https://docs.python.org/3/library/argparse.html

2 个答案:

答案 0 :(得分:2)

Argparse使用辅助类argparse.helpformatter(),它使用max_help_positionwidth参数(以及其他参数)。请参阅此优秀答案,说明如何使用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。也可以使用partialformatter_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_usageprint_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知识,但最终会为我们提供更多的自定义功能。