我正在尝试生成click
来自配置文件的命令。本质上,这个模式:
import click
@click.group()
def main():
pass
commands = ['foo', 'bar', 'baz']
for c in commands:
def _f():
print("I am the '{}' command".format(c))
_f = main.command(name=c)(_f)
if __name__ == '__main__':
main()
The --help
文字看起来不错:
Usage: test_click.py [OPTIONS] COMMAND [ARGS]...
Options:
--help Show this message and exit.
Commands:
bar
baz
foo
然而,所有命令似乎都会路由到生成的最后一个命令:
$ ./test_click.py foo
I am the 'baz' command
$ ./test_click.py bar
I am the 'baz' command
$ ./test_click.py baz
I am the 'baz' command
我正在尝试的事情实际上可能吗?
问题出在 python 的功能范围上。当您创建函数时_f
它正在使用c
它的范围比函数更高。所以当你调用该函数时它不会被保留。 (_f
当您调用 main 时调用)
当你调用时main
循环完成,c 将始终保存循环的最后一个值 - 即baz
解决方案是附加值c
使用自己的范围来运行。
import click
@click.group()
def main():
pass
commands = ['foo', 'bar', 'baz']
def bind_function(name, c):
def func():
print("I am the '{}' command".format(c))
func.__name__ = name
return func
for c in commands:
f = bind_function('_f', c)
_f = main.command(name=c)(f)
if __name__ == '__main__':
main()
The bind_function
如果需要,还允许您以不同的方式命名您的函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)