2012-03-08 16 views
0

私はPythonのコマンドラインツールを作成するためにくっライブラリを使用していて略語を設定します。私が使用している名前のいくつかはかなり長くなっています。例:簡単な方法は、arghに

./my_program.py download-and-parse-data --randomize-order --training-percent 80 

簡略化の方法はありますか?たとえば、上記の行の潜在的な省略形があります。長く、有益なバージョンだけでなく、短い、簡単に型バージョン -

./my_program.py dpd -r -t 80 

理想的には、私は両方コマンドラインフォームを使用できるようにしたいと思います。これを行う良い方法はありますか?

答えて

0

あなたは​​のadd_subparsers()方法で非常に簡単にこれを行うことができます。ドキュメントhereを参照してください。あなたはまた、複数の引数名を使用することができ、各add_argument()コールで

parser = argparse.ArgumentParser() 
subs = parser.add_subparsers() 
dpd = subs.add_parser('download-and-parse-data', aliases=['dpd']) 
dpd.add_argument(...) 
... 

EDIT

あなたのケースではそれはこれに壊すかもしれません。 docs hereを参照してください。例えば:​​答えを受け入れたが、元の質問は単純arghモジュールでこれを達成するためにどのようにし

parser.add_argument('-f', '--foo') 
3

。方法は次のとおりです。

from argh import * 
from show import show # only needed for demonstration purposes 

CMD_ALIASES = { 'dpd' : 'download-and-parse-data', 
       'dp' : 'download-and-parse-data', 
       'dd' : 'download-data', 
       'pd' : 'parse-data', } 

def choices_for(d): 
    """ 
    Return list of unique items (command aliases plus unabridged commands). 
    Works in Python >= 2.5. NB In the degenerate case when an alias and an 
    unabridged command are identical, the alias takes priority. (In my best 
    Terminator voice: Don't do dat.) 
    """ 
    return sorted(set(d.keys()) | set(d.values())) 

@arg('cmd', choices=choices_for(CMD_ALIASES)) 
@arg('-r', '--randomize-order', default=False) 
@arg('-t', '--training-percent', default=0) 
def main(args): 
    args.command = CMD_ALIASES.get(args.cmd, args.cmd) 
    show(args, props=True) 

dispatch_command(main) 

これは、少し一般化されたエイリアシングメカニズム(任意のコマンドに対して複数のエイリアスを許可するメカニズム)を設定します。得argsオブジェクトは、実際に与えられたコマンドのargs.cmd値、およびもしあれば、指定された別名を解決カノニカルargs.command値の両方を有しています。例えば

@aliasesデコレータ、hereを説明:

$ ./my_program.py dpd -r -t 80 
args: 
    cmd='dpd' 
    command='download-and-parse-data' 
    randomize_order=True 
    training_percent=80 

あなたは、個々の機能にコマンドを派遣している場合、コマンドエイリアスを行うためにarghに組み込まれた別のメカニズムでもあります。注意:このアプローチは最近のバージョン​​に依存しているため、古いPythonディストリビューション/環境では動作しない可能性があります。