0

argvコマンドラインに与えられた引数を解析するためのパラメータとして使用するpythonクラスを使用しています。このクラスが使用しているパーサーの種類はわかりません。とにかく、このクラスを変更することはできません。

ここで、上記のクラスから派生した新しいクラスを作成し、追加の引数をargparse. argparse元のクラスの機能をそのまま維持し、「結合された」ヘルプ出力を使用して、最もシンプルで信頼性が高く、pythonic な方法でこれを達成するにはどうすればよいですか?

4

1 に答える 1

0

メソッドは、追加の引数を選択するのparse_known_argsに役立ちます。sys.argvその後、残りの引数文字列の 2 番目の出力に置き換えて、制御を渡すことができます。

使用しているパーサーやパーサーへのアクセスがわからない場合、ヘルプ出力を組み合わせることは難しくなります。私が考えることができる最良のオプションは、プログラムを--helpor で一度実行し、出力を文字列として保存し、それをdescriptionorに追加することepilogです。コードがどのように機能するかに応じて、次の行に沿ってこのプロセスを自動化できます

import argparse
import sys
from StringIO import StringIO

old_stderr = sys.stderr
sys.stderr = cap = StringIO()
old_argv = sys.argv
sys.argv = ['--help']
TheClass().parse_args()
sys.stderr = old_stderr
sys.argv = old_argv

parser = argparse.ArgumentParser(description=cap.read())
parser.add_argument('--foo', type=float)

my_args, remainder = parser.parse_known_args()
sys.argv = remainder

TheClass(foo=my_args.foo).parse_args()

(テストされていないコード、購入者は注意してください。)

これにより、2 つの最初の使用方法の行が表示される可能性がかなり高くなります。最初の行には引数がリストされ、2 番目の行には内部クラスの引数がリストされます。argparseの行を引数でカスタマイズできますがusage、それでも少し奇妙に見えるでしょう。文字列を手動で編集せずにそれを回避する方法がわかりません。

于 2013-01-07T10:17:59.657 に答える