簡體   English   中英

python argparse helpformatter類的文檔在哪里?

[英]where is the documentation for the python argparse helpformatter class?

我已經找到了python argparse模塊的文檔,並且提到了formatter_class。 我在該頁面上看不到寬度參數或max_help_position之類的東西。 這些在哪里記錄?

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

Argparse使用輔助類argparse.helpformatter(),該類使用max_help_positionwidth參數(以及其他參數)。 看到這個出色的答案,它解釋了如何使用解釋lambda argparse.HelpFormatter(prog,width)

查找有關文檔的問題是因為HelpFormatter僅在其名稱的意義上是公開的。 它的所有方法都是私有的。

這取自您提供的文檔https://github.com/python/cpython/blob/2.7/Lib/argparse.py中鏈接的源代碼:

類HelpFormatter(object):

用於生成使用情況消息和參數幫助字符串的格式化程序。

僅此類的名稱被認為是公共API。 該類提供的所有方法均被視為實現細節。

因此argparse文檔本身是操作方法和正式API描述的組合。 通常,它描述了如何執行常見的解析任務。 盡管argparse由類組成,但文檔並未正式描述這些類及其子類和所有方法。 它不是參考API。

一種解決方法是找到另一種使用HelpFormatter類的服務,該服務可以更好地記錄其變量,例如Discord https://discordpy.readthedocs.io/en/rewrite/ext/commands/api.html#discord.ext中的服務.commands.HelpFormatter

希望這可以幫助。

更新

Discord更新了其鏈接,因此上述鏈接現在已斷開。 而是在WayBackMachine中找到它: https ://web.archive.org/web/20180306073319/https://discordpy.readthedocs.io/en/rewrite/ext/commands/api.html#discord.ext.commands.HelpFormatter

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子類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如何使用formatter類。

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參數的格式化程序, 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知識,但最終為我們提供了更多的自定義功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM