2016-11-17 4 views
0

私は同じコードベースのライブラリを混在させていますが、argparseを使っているものとoptparseを使っているものがあります。optparseからargparseへの簡単なラッパー?

私はすべてのオプションをマスター設定ツールに統合したいと思っています。理想的には、さまざまなライブラリとツールを使用したり編集したりする必要はありません。

optparseオプションオブジェクトをargparseパーサーにラップ(または他の方法で統合)することは可能ですか?その場合、パーサーはoptparseオプションで拡張されます(衝突は強調されますなど)?

+1

短い答えは、 'argparse'は' OptionParser'インスタンスを引数として受け入れ、それと同等の 'ArgumentParser'インスタンスを返す関数を持っていません。より長い答えは、単にそのような機能を提供するサードパーティのライブラリに対する推奨にすぎません。 – chepner

+0

ハム。 argparseがoptparseラッパーを持つのが難しくはありません(何か不足している場合を除きます)。 – blueberryfields

+0

自分で書くだけです。最も重要なのは、optparseパーサーから関連するパラメータを抽出することです。互換性のあるパラメータセットを取得したら、新しいargparse引数を簡単に作成できます。 argparseをargparseに変換するためのargparseドキュメントの最後にはガイドラインがあります。もっと議論が必要な場合は、具体的な例を挙げてください。 – hpaulj

答えて

1

私はちょうどoptparseパーザを作った。ここでは、オブジェクトの属性

In [229]: parser = OptionParser() 
In [230]: parser 
Out[230]: <optparse.OptionParser at 0xaf912a4c> 
In [231]: parser.add_option("-f", "--file", dest="filename", 
    ...:     help="write report to FILE", metavar="FILE") 
Out[231]: <Option at 0xaf919b2c: -f/--file> 
In [232]: parser.option_list 
Out[232]: [<Option at 0xaf91232c: -h/--help>, <Option at 0xaf919b2c: -f/--file>] 

In [233]: vars(parser.option_list[1]) 
Out[233]: 
{'_long_opts': ['--file'], 
'_short_opts': ['-f'], 
'action': 'store', 
'callback': None, 
'callback_args': None, 
'callback_kwargs': None, 
'choices': None, 
'const': None, 
'container': <optparse.OptionParser at 0xaf912a4c>, 
'default': ('NO', 'DEFAULT'), 
'dest': 'filename', 
'help': 'write report to FILE', 
'metavar': 'FILE', 
'nargs': 1 
'type': 'string'} 

In [234]: vars(parser) 
Out[234]: 
{'_long_opt': {'--file': <Option at 0xaf919b2c: -f/--file>, 
    '--help': <Option at 0xaf91232c: -h/--help>}, 
'_short_opt': {'-f': <Option at 0xaf919b2c: -f/--file>, 
    '-h': <Option at 0xaf91232c: -h/--help>}, 
'allow_interspersed_args': True, 
'conflict_handler': 'error', 
'defaults': {'filename': None}, 
'description': None, 
'epilog': None, 
'formatter': <optparse.IndentedHelpFormatter at 0xaf8feb0c>, 
'largs': None, 
'option_class': optparse.Option, 
'option_groups': [], 
'option_list': [<Option at 0xaf91232c: -h/--help>, 
    <Option at 0xaf919b2c: -f/--file>], 
'process_default_values': True, 
'prog': None, 
'rargs': None, 
'usage': '%prog [options]', 
'values': None, 
'version': None} 

は「ラッパーは、」のような何かをする必要がありますされています

In [252]: pa = argparse.ArgumentParser() 

In [253]: a1=parser.option_list[1] 
In [254]: assert(a1.action=='store') 
In [255]: ostrings=[] 
In [256]: ostrings.extend(a1._short_opts) 
In [257]: ostrings.extend(a1._long_opts) 
In [259]: assert(a1.const is None) 
In [260]: ohelp=a1.help 
In [261]: odest=a1.dest 
In [262]: ometa=a1.metavar 

In [264]: pa.add_argument(*ostrings, dest=odest, metavar=ometa, help=ohelp) 
Out[264]: _StoreAction(option_strings=['-f', '--file'], 
    dest='filename', nargs=None, const=None, default=None, type=None, 
    choices=None, help='write report to FILE', metavar='FILE') 

は役立ちます比較:

In [265]: pa.print_help() 
usage: ipython3 [-h] [-f FILE] 

optional arguments: 
    -h, --help   show this help message and exit 
    -f FILE, --file FILE write report to FILE 

In [267]: parser.print_help() 
Usage: ipython3 [options] 

Options: 
    -h, --help   show this help message and exit 
    -f FILE, --file=FILE write report to FILE 

をしかし、あなたはそのように書いた場合でも、どのようにワークフローに収まるでしょうか?実行時に組み込むのに十分な堅牢性を備えていますか?

関連する問題