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

时间:2012-01-04 09:00:04

标签: python class arguments argparse

我在理解python 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的类,其中包含三个主要方法makecleancompile以及其他私有方法{{1 }和_iterator

更新完整的脚本位于:http://dpaste.com/hold/681317/

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

1 个答案:

答案 0 :(得分:8)

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

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

特别是,这一部分:

lang.make()

因此,func arg设置为make的返回值。

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

parser_make.set_defaults(func=lang.make)

<强>更新

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

所以在你解析args之后,你必须自己调用它:

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

此处args.func将是方法对象之一(lang.makelang.compilelang.clean,具体取决于指定哪个命令作为脚本参数)。将调用运算符()应用于它将执行它。