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
,它有三个主要的方法,分别是make
、clean
和compile
,还有其他一些私有方法,_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.make
、lang.compile
或 lang.clean
,具体取决于你在脚本参数中指定了哪个命令)。对它使用调用操作符 ()
就会执行这个方法。