tldnr:関数が与えられた場合、その署名からArgumentParserを自動的に作成する方法はありますか?
コマンドラインに公開したい関数がたくさんあります。つまり、基本的に、モジュールは次のとおりです。
def copy(foo, bar, baz):
...
def move(from, to):
...
def unlink(parrot, nomore=True):
...
if __name__ == '__main__':
argparse stuff
これは、次のようにコマンドラインから呼び出すことができます。
python commands.py move spam ham
python commands.py unlink --parrot Polly
これは実装が非常に簡単ですが、多くの配線が必要です。
parser = argparse.ArgumentParser(...)
subparsers = parser.add_subparsers()
...
c = subparsers.add_parser('unlink', description='Unlink a parrot')
c.add_argument('--parrot', help='parrots name', required=True)
c.add_argument('--nomore', help='this parrot is no more', action='store_true')
...
c = subparsers.add_parser('move', description='Move stuff')
...
など、関数ごとに。最悪の場合、関数の引数が変更された場合(そして変更された場合)、argparseのものを手動で同期する必要があります。
関数が自分自身にargparseのものを提供できれば、メインコードは次のようになります。
parser = argparse.ArgumentParser(...)
subparsers = parser.add_subparsers()
copy.register(subparsers)
move.register(subparsers)
unlink.register(subparsers)
...
私はこれらの線に沿って何かを考えました:
@args(
description='Unlink a parrot',
parrot={'required':True, 'help':'parrots name'},
nomore={'action': 'store_true', 'help': 'this parrot is no more'}
)
def unlink(parrot, nomore=True):
...
私の質問:
- このようなことをするライブラリはありますか?
- いいえの場合、そのようなデコレータを作成することは可能ですか?
- 私が欲しいものを実装する他の/より良い方法はありますか?
更新:
placが解決策のようです。これが私がplacでやりたいことをする方法です:
コマンドモジュール:cmds.py:
import plac
@plac.annotations(
foo=('the foo thing'),
bar=('the bar thing'),
fast=('do a fast copy', 'flag')
)
def copy(foo, bar, fast=False):
"""Copy some foo to bar."""
pass
@plac.annotations(
parrots=('parrots names'),
nomore=('these parrots are no more', 'flag'),
repeat=('repeat n times', 'option', 'r', int)
)
def unlink(nomore=False, repeat=1, *parrots):
"""Unlink some parrots."""
pass
#more commands...
# export commands so that plac knows about them
commands = 'copy', 'unlink'
メインモジュールは次のとおりです。
import plac
import cmds
plac.call(cmds)
あなたが私に尋ねればかなりきちんとしています。