2012-01-04 2 views
1

У меня возникли проблемы с пониманием того, как работает python argparse.argparse - Почему код выполняется без вызова?

В моем скрипте есть три позиционных аргумента, которые не принимают параметры: make, compile и clean. Я проделал это через подпарамеры, как говорит документация, но мой код продолжает работать без аргументов или даже с аргументами, что он не вызывает правильную функцию (он запускает 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() 

Первая строка вызывает только класс в файле, называется Language с тремя основными способами, make, clean и compile и другие частные методы, _iterator и __init__.

Update Полный сценарий здесь: http://dpaste.com/hold/681317/

Что я пропускаю из документации для запуска этого?

+1

Если ваша цель связана с простыми позиционными аргументами, я рекомендую вам взглянуть на любую из этих оберток argparse: http://plac.googlecode.com/hg/doc/plac.html http: //packages.python. org/argh/reference.html –

+0

+1, не знал о них :) –

+0

Мы все здесь, чтобы помочь друг другу :) –

ответ

7

Это потому, что вы вызываете make себя, здесь:

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

В particullar, эта часть:

lang.make() 

В результате func агд устанавливается на значение, возвращаемое make ,

Вместо этого, вы, вероятно, хотите, чтобы передать метод в качестве аргумента, не называя его:

parser_make.set_defaults(func=lang.make) 

Update

Обратите внимание, что argparse не будет вызывать методы для вас. Он вернет их в атрибут func объекта args, который возвращается парсером.

Так после разбора арга, вы должны назвать его самостоятельно:

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

Здесь args.func будет один из объектов методы (lang.make, lang.compile или lang.clean в зависимости от которых команда была задана в качестве аргумента сценария) , Применяя оператор вызова () к нему, он выполнит его.

+0

Таким образом, когда я выполняю сценарий, он ничего не возвращает. Вы можете увидеть полный скрипт здесь: http://dpaste.com/hold/681317/ –

+0

Прочтите обновленный ответ. – yak

+0

\ * piano падает на oscar \ * Я не понимал, что достаточно просто вызвать func(). благодаря –

Смежные вопросы