Pythonのoptparseを使用して位置引数ヘルプをフォーマットするにはどうすればよいですか?
-
22-07-2019 - |
質問
ドキュメントに記載されているとおり optparse.OptionParser
は、 IndentedHelpFormatter
を使用して、フォーマットされたオプションヘルプを出力します。 tags / 0.5.0 / apidocs / optparse.IndentedHelpFormatter-class.html "rel =" noreferrer "> APIドキュメント。
必要な位置引数について、同様の形式のヘルプテキストを使用テキストに表示したい。同様の位置引数のフォーマットに使用できるアダプターまたは単純な使用パターンはありますか?
明確化
できればstdlibのみを使用してください。 Optparseは、この1つのフォーマットの微妙な違いを除いて、非常に優れています。他のパッケージ全体をインポートせずに修正できるはずです。 :-)
解決
最善策は、optparseモジュールにパッチを書くことです。それまでの間、わずかに変更されたOptionParserクラスでこれを実現できます。これは完璧ではありませんが、やりたいことを実現できます。
#!/usr/bin/env python
from optparse import OptionParser, Option, IndentedHelpFormatter
class PosOptionParser(OptionParser):
def format_help(self, formatter=None):
class Positional(object):
def __init__(self, args):
self.option_groups = []
self.option_list = args
positional = Positional(self.positional)
formatter = IndentedHelpFormatter()
formatter.store_option_strings(positional)
output = ['\n', formatter.format_heading("Positional Arguments")]
formatter.indent()
pos_help = [formatter.format_option(opt) for opt in self.positional]
pos_help = [line.replace('--','') for line in pos_help]
output += pos_help
return OptionParser.format_help(self, formatter) + ''.join(output)
def add_positional_argument(self, option):
try:
args = self.positional
except AttributeError:
args = []
args.append(option)
self.positional = args
def set_out(self, out):
self.out = out
def main():
usage = "usage: %prog [options] bar baz"
parser = PosOptionParser(usage)
parser.add_option('-f', '--foo', dest='foo',
help='Enable foo')
parser.add_positional_argument(Option('--bar', action='store_true',
help='The bar positional argument'))
parser.add_positional_argument(Option('--baz', action='store_true',
help='The baz positional argument'))
(options, args) = parser.parse_args()
if len(args) != 2:
parser.error("incorrect number of arguments")
pass
if __name__ == '__main__':
main()
そして、これを実行して得られる出力:
Usage: test.py [options] bar baz
Options:
-h, --help show this help message and exit
-f FOO, --foo=FOO Enable foo
Positional Arguments:
bar The bar positional argument
baz The baz positional argument
他のヒント
argparse をご覧ください。ドキュメントには、位置引数と見栄えの良いヘルプメッセージがサポートされていると記載されています。
これに対するクリーンなソリューションに興味があります。私は1つを思い付くことができませんでした。 OptionParserはオプションに完全に焦点を合わせています。私が見つけることができる限り、それはあなたにポジション引数を扱うために何も与えません。
私がやったのは、 \ t
sを使用して適切なスペースを確保するために、位置引数ごとに小さなドキュメントブロックのリストを生成することでした。次に、改行でそれらを結合し、OptionParserに渡される 'usage'文字列に追加しました。
見た目は良いのですが、ばかげているように感じます。もちろん、オプションのリストの上にドキュメントが表示されることになります。私はそれを回避する方法、または複雑なことを行う方法を見つけていません。つまり、特定のオプションのセットは、その引数にのみ適用されるため、位置引数の説明の下に説明されています。
モンキーパッチOptionParserのメソッドを見て、(これは1年ほど前だった)それほど難しくはなかったことを覚えていますが、その道をたどりたくありませんでした。
位置引数のほとんどのヘルプテキストは、* NIXボックスのマニュアルページで頻繁に使用される形式に似ています。 「cp」コマンドの文書化方法をご覧ください。ヘルプテキストはそれに似ている必要があります。
それ以外の場合は、「ヘルプ」に記入する限りパーサーの使用中に引数を指定すると、ドキュメント自体が生成されます。