Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何按函数返回*args、**kwargs_Python_Python 3.x - Fatal编程技术网

Python 如何按函数返回*args、**kwargs

Python 如何按函数返回*args、**kwargs,python,python-3.x,Python,Python 3.x,接受参数列表和关键字参数的简单函数: def foo(*args, **kwargs): print(args, kwargs) 我可以如下调用此函数 foo('foo', 'bar', 'baz', hoge='H', fuga='F') 或 问题:我可以通过另一个函数传递参数吗 foo(produce_arg()) 我正在用Click编写CLI脚本。 几个子命令采用相同的选项: @click.group() def cli(): pass @cli.command(

接受参数列表和关键字参数的简单函数:

def foo(*args, **kwargs):
    print(args, kwargs)
我可以如下调用此函数

foo('foo', 'bar', 'baz', hoge='H', fuga='F')

问题:我可以通过另一个函数传递参数吗

foo(produce_arg())

我正在用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

...
我认为它不干燥,所以我想写如下:

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())
这将是一种稍微不同的方法

两者都使用一个helper函数来调用目标函数

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

你的答案正是我想要的!!谢谢!!
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