2012-01-04 1 views
1

私はPythonのargparseの仕組みを理解するのに少し苦労しています。argparse - コードは呼び出されずに実行されるのはなぜですか?

私のスクリプトには、パラメータを取らない3つの位置指定引数、make、コンパイル、クリーンがあります。私はドキュメントのようにサブパーザルでやったことがありますが、私のコードは引き数なしで実行され続けます。また、適切な関数(それはすべてのケースでLanguage()。make()を実行します)

マイargparseコード:

lang = Language() 
parser = argparse.ArgumentParser(description='e-cidadania language catalog generator.') 
subparser = parser.add_subparsers() 
parser_make = subparser.add_parser('make', help='Create all the language' \ 
               ' catalogs for translation,'\ 
               ' including JavaScript.') 
parser_make.set_defaults(func=lang.make()) 

parser_compile = subparser.add_parser('compile', help='Compile all the language' \ 
                 ' catalogs for use.') 
parser_compile.set_defaults(func=lang.compile()) 

parser_clean = subparser.add_parser('clean', help='Delete all the language catalogs.' \ 
                ' After this you will'\ 
                ' have to rebuild the catalogs' \ 
                ' and translate them.') 
parser_clean.set_defaults(func=lang.clean()) 


args = parser.parse_args() 

最初の行は、ファイル内の唯一のクラスを呼び出すには、三つの主要な方法、makecleancompileや他の民間方法、_iterator__init__Languageと呼ばれます。

更新完全なスクリプトはここにある:http://dpaste.com/hold/681317/

私はこれを実行するために、文書から欠落していますか? particullarで

parser_make.set_defaults(func=lang.make()) 

、この部分:

lang.make() 

をその結果、func argはmakeの戻り値に設定されますが、ここで、自分makeを呼んでいるので、だ

+1

あなたの目標が単純な位置引数を扱う場合は、次のargparseラッパーを参照することをおすすめします。http://plac.googlecode.com/hg/doc/plac.html http://packages.python org/argh/reference.html –

+0

+1、それらについて知りませんでした:) –

+0

私たちはお互いに助けています:) –

答えて

7

代わりに、あなたはおそらくそれを呼び出すことなく、引数としてメソッドを渡したい:

parser_make.set_defaults(func=lang.make) 

更新

​​はあなたのためのメソッドを呼び出していないことに注意してください。これは、パーサによって返されたargsオブジェクトのfunc属性でそれらを返します。

あなたは引数を解析した後ので、あなたはそれを自分で呼び出す必要があり:

args = parser.parse_args() 
args.func() 

ここargs.funcは(スクリプト引数として指定されたコマンドに応じlang.makelang.compileまたはlang.clean)メソッドオブジェクトのいずれかになります。通話オペレータ()を適用すると、それが実行されます。

+0

そのようにしてスクリプトを実行すると、何も返されません。ここでは、完全なスクリプトを見ることができます:http://dpaste.com/hold/681317/ –

+0

更新された答えをお読みください。 – yak

+0

\ *ピアノはオスカーに落ちる\ *私はfunc()を呼び出すだけで十分であることを認識していませんでした。ありがとう –

関連する問題