[英]How to return *args, **kwargs by function
带参数列表和关键字参数的简单函数:
def foo(*args, **kwargs):
print(args, kwargs)
我可以按如下方式调用此函数
foo('foo', 'bar', 'baz', hoge='H', fuga='F')
要么
l = ['foo', 'bar']
kw = {'hoge': 'H', 'fuga': 'F'}
foo(*l, **kw)
问题 :我可以通过其他函数传递参数吗?
foo(produce_arg())
我正在使用Click https://palletsprojects.com/p/click/编写CLI脚本。 几个子命令采用相同的选项:
@click.group()
def cli():
pass
@cli.command()
@cli.option('--target', type=str, ...)
@cli.option('--exec', is_flag=True, ...)
...
def foo():
pass
@cli.command()
@cli.option('--target', type=str, ...)
...
def bar():
pass
@cli.command()
@cli.option('--exec', is_flag=True, ...)
...
def baz():
pass
...
我认为这不是DRY,所以我想写如下:
def definition_of(optname):
# so magical code!
@click.group()
def cli():
pass
@cli.command()
@cli.option(definition_of('target'))
@cli.option(definition_of('exec'))
...
def foo():
pass
@cli.command()
@cli.option(definition_of('target'))
...
def bar():
pass
@cli.command()
@cli.option(definition_of('exec'))
...
def baz():
pass
...
有任何想法吗?
直接解决您的问题:是的,您可以通过另一个函数传递参数:
a, k = produce_arg()
foo(*a, **k)
这个过程可以“隐藏”,在某种程度上:
def pass_a_k(func, ak):
return func(*ak[0], **ak[1])
pass_a_k(foo, produce_arg())
将是一种方法,
def pass_a_k(func, a, k):
return func(*a, **k)
pass_a_k(foo, *produce_arg())
会有一个稍微不同的方法。
两者都使用辅助函数来调用目标函数。
def pass_a_k(func, a, k):
return func(*a, **k)
def adapt_a_k(func):
# here, maybe fool around with functools.wraps etc.
return lambda a, k: func(*a, **k)
adapt_a_k(foo)(*produce_arg())
(或其各自的对应方)将是另一种方法。 在这里,如果您需要更频繁地保持“适应”功能将是有帮助的。
在你的例子中,那可能是
cli_option_a_k = adapt_a_k(cli.option)
@cli_option_a_k(*definition_of('target'))
@cli_option_a_k(*definition_of('exec'))
...
def foo():
pass
甚至
cli_option_by_optname = lambda optname: adapt_a_k(cli.option)(*definition_of(optname))
cli_option_by_optname = lambda optname: pass_a_k(cli.option, *definition_of(optname))
@cli_option_by_optname('target')
@cli_option_by_optname('exec')
...
def foo():
pass
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.