Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.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/5/sql/67.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中将KWARG传递给另一个KWARG?_Python - Fatal编程技术网

如何在python中将KWARG传递给另一个KWARG?

如何在python中将KWARG传递给另一个KWARG?,python,Python,如果我想实现以下功能。我如何处理上面的代码 def a(**akwargs): def b(bkwargs=akwargs): # how to not only use akwargs defaultly,but also define bkwargs by # myself? print bkwargs return b 使用外部函数中的KWARG作为默认值,并更新传递给内部函数的KWARG >>>a(u='

如果我想实现以下功能。我如何处理上面的代码

def a(**akwargs):
    def b(bkwargs=akwargs):
        # how to not only use akwargs defaultly,but also define bkwargs by
        # myself?
        print bkwargs
    return b

使用外部函数中的KWARG作为默认值,并更新传递给内部函数的KWARG

>>>a(u='test')()
{'u': test}

>>>a(u='test')(u='test2')
{'u': test2}
如果没有为内部函数指定KWARG,则下一个函数将使用外部函数中的KWARG

from functools import partial

def outer(**kwargs):
    def inner(**kwargs):
        return(kwargs)
    return partial(inner, **kwargs)

使用外部函数中的KWARG作为默认值,并更新传递给内部函数的KWARG

>>>a(u='test')()
{'u': test}

>>>a(u='test')(u='test2')
{'u': test2}
如果没有为内部函数指定KWARG,则下一个函数将使用外部函数中的KWARG

from functools import partial

def outer(**kwargs):
    def inner(**kwargs):
        return(kwargs)
    return partial(inner, **kwargs)

有点不清楚你想要什么,但我认为这就是诀窍:

def outer(**outer_kwargs):
    def inner(**inner_kwargs):
        kwargs = inner_kwargs or outer_kwargs
        return kwargs
    return inner

有点不清楚你想要什么,但我认为这就是诀窍:

def outer(**outer_kwargs):
    def inner(**inner_kwargs):
        kwargs = inner_kwargs or outer_kwargs
        return kwargs
    return inner

为什么不这样做呢

def a(**akwargs):
    def b(bkwargs=akwargs, **kwargs):
        # how to not only use akwargs defaultly,but also define bkwargs by
        # myself?
        if not bkwargs:
            bkwargs = kwargs
        else:
            # it depends what you want here (merge or replace?), but probably
            # something like bkwargs.update(kwargs) or kwargs.update(bkwargs)
    return b
这将使用
a
中的值,但允许您通过将更多值传递到
b
来覆盖它。因此:

def a(**akwargs):
    def b(**bkwargs):
        allkwargs = {}
        allkwargs.update(akwargs)
        allkwargs.update(bkwargs)
        print allkwargs
    return b

为什么不这样做呢

def a(**akwargs):
    def b(bkwargs=akwargs, **kwargs):
        # how to not only use akwargs defaultly,but also define bkwargs by
        # myself?
        if not bkwargs:
            bkwargs = kwargs
        else:
            # it depends what you want here (merge or replace?), but probably
            # something like bkwargs.update(kwargs) or kwargs.update(bkwargs)
    return b
这将使用
a
中的值,但允许您通过将更多值传递到
b
来覆盖它。因此:

def a(**akwargs):
    def b(**bkwargs):
        allkwargs = {}
        allkwargs.update(akwargs)
        allkwargs.update(bkwargs)
        print allkwargs
    return b

如果OP想要
a(u='test')(v='test2')
提供
{'v':'test2'}
而不是
{'u':'test','v':'test2'}
,这将不起作用。@WKPlus我认为目的是使用第一个kwargs作为默认值,并在需要时使用第二个kwargs(和覆盖键)来增加它们。如果这不是目的,那么这将不是一个好的函数。@WKPlus你真的抓住了我的目的。如果OP想要
a(u='test')(v='test2')
给出
{v':'test2'}
而不是
{u':'test',v':'test2}
,这不起作用。@WKPlus我以为目的是使用第一个KWARG作为默认值,并在需要时使用第二个KWARG(和覆盖键)来增强这些KWARG。如果这不是目的,那么这将不是一个好函数。@WKPlus你真的抓住了我的意图。这个解决方案很有效,但我发现它是这里最笨拙的解决方案,你不认为使用
partial
可以给你一个更干净的解决方案吗?@brunsgaard我们可以制作
a(u='test')(v='test2')
gives
{v':'test2'}
使用
functools
?@WKPlus,是的,这正是发生的;)@brunsgaard不,根据您答案中的代码,它给出了
{'u':'test',v':'test2'}
而不是
{'v':'test2'}
我们无法确定他/她是想要更新还是仅仅替换kwargs。但维姆的答案两者都适用。如果更新,
functools
工作得很好,很酷:)这个解决方案工作得很好,但我觉得它是这里最笨拙的解决方案,你不认为使用
partial
会给你一个更干净的解决方案吗?@brunsgaard我们能把
a(u='test')(v='test2')
functools
结合起来吗?@WKPlus,是的,事实就是这样;)@brunsgaard不,根据您答案中的代码,它给出了
{'u':'test',v':'test2'}
而不是
{'v':'test2'}
我们无法确定他/她是想要更新还是仅仅替换kwargs。但维姆的答案两者都适用。如果更新,
functools
运行良好且很酷:)第二个非常好,这正是我想要的,谢谢。第二个非常好,这正是我想要的,谢谢。