argparse - 为什么代码在未被调用时就被执行?

3 投票
1 回答
2874 浏览
提问于 2025-04-17 09:30

我有点搞不懂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,还有其他一些私有方法,_iterator__init__

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

我在文档中缺少什么才能让这个运行起来呢?

1 个回答

9

这是因为你在这里自己调用了 make

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

特别是这一部分:

lang.make()

结果是,func 参数被设置为 make 的返回值。

其实,你可能想要的是把方法作为参数传递,而不是直接调用它:

parser_make.set_defaults(func=lang.make)

更新

注意,argparse 不会为你调用这些方法。它会把方法放在解析器返回的 args 对象的 func 属性里。

所以在你解析完参数后,你需要自己去调用它:

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

在这里,args.func 将是某个方法对象(lang.makelang.compilelang.clean,具体取决于你在脚本参数中指定了哪个命令)。对它使用调用操作符 () 就会执行这个方法。

撰写回答