argparse - 为什么代码在没有被调用的情况下执行?

Osc*_*lal 2 python arguments class argparse

我在理解python argparse如何工作方面遇到了一些麻烦.

我的脚本有三个不带参数的位置参数:make,compile和clean.我已经通过像文档说的那样通过subparser完成了它,但是我的代码在没有参数的情况下继续运行,甚至没有参数,它也没有调用正确的函数(它在每种情况下运行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()
Run Code Online (Sandbox Code Playgroud)

第一行调用文件中的唯一一类,称为Language有三种主要方法,make,clean并且compile和其他私有方法,_iterator__init__.

更新完整的脚本在这里:http://dpaste.com/hold/681317/

我在文档中缺少什么来运行它?

yak*_*yak 8

那是因为你在打电话给make自己,在这里:

parser_make.set_defaults(func=lang.make())
Run Code Online (Sandbox Code Playgroud)

特别是,这部分:

lang.make()
Run Code Online (Sandbox Code Playgroud)

结果,funcarg被设置为返回值make.

相反,您可能希望将该方法作为参数传递,而不调用它:

parser_make.set_defaults(func=lang.make)
Run Code Online (Sandbox Code Playgroud)

更新

请注意,argparse不会为您调用方法.它将在解析器返回funcargs对象的属性中返回它们.

因此,在解析args后,您必须自己调用它:

args = parser.parse_args()
args.func()
Run Code Online (Sandbox Code Playgroud)

这里args.func将是该方法的一个对象(lang.make,lang.compilelang.clean取决于其中命令被指定为脚本参数上).将调用运算符()应用于它将执行它.