繁体   English   中英

使用 **kwargs 将 **kwargs 参数传递给另一个函数

[英]pass **kwargs argument to another function with **kwargs

我不明白下面的例子,假设我有这些功能:

# python likes
def save(filename, data, **kwargs):
    fo = openX(filename, "w", **kwargs) # <- #1
    fo.write(data)
    fo.close()
# python doesnt like
def save2(filename, data, **kwargs):
    fo = openX(filename, "w", kwargs) # <- #2
    fo.write(data)
    fo.close()

def openX(filename, mode, **kwargs):
    #doing something fancy and returning a file object

为什么#1 是正确的解决方案而#2 是错误的解决方案? **kwargs基本上是一个 dict,所以如果我想将参数传递给 openX,我认为正确的方法是没有**而只是给出 dict。 但是 Python 显然不喜欢第二个参数,并告诉我我给出了 3 个参数而不是 2 个参数。

那么这背后的原因是什么呢?

在第二个示例中,您提供 3 个参数:文件名、模式和字典 ( kwargs )。 但是 Python 需要:2 个形式参数加上关键字参数。

通过在字典前加上 '**' 前缀,您可以将字典kwargs解压缩为关键字参数。

字典(类型dict )是包含键值对的单个变量。

“关键字参数”是键值方法参数。

任何字典都可以通过在函数调用期间以**为前缀来解压为关键字参数。

**语法告诉 Python 将关键字参数收集到字典中。 save2将它作为非关键字参数(字典对象)传递下去。 openX没有看到任何关键字参数,所以**args不会被使用。 相反,它获得了第三个非关键字参数(字典)。 要解决这个问题,请更改openX函数的定义。

def openX(filename, mode, kwargs):
    pass

扩展@gecco 的答案,以下是一个示例,将向您展示差异:

def foo(**kwargs):
    for entry in kwargs.items():
        print("Key: {}, value: {}".format(entry[0], entry[1]))

# call using normal keys:
foo(a=1, b=2, c=3)
# call using an unpacked dictionary:
foo(**{"a": 1, "b":2, "c":3})

# call using a dictionary fails because the function will think you are
# giving it a positional argument
foo({"a": 1, "b": 2, "c": 3})
# this yields the same error as any other positional argument
foo(3)
foo("string")

在这里您可以看到解压字典的工作原理,以及为什么发送实际字典会失败

对于 #2 args 将只是一个带有 dict 值的形式参数,而不是关键字类型参数。

如果要将关键字类型参数传递给关键字参数,则需要在字典前指定 **,即 **args

查看此以获取有关使用 **kw 的更多详细信息

http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/

因为字典是单个值。 如果要将其作为一组关键字参数传递,则需要使用关键字扩展。

上述声明如下:

def模型(特征,目标):全局args regularizer =无regularrizsation_type = args.regularizastion_type.lower ...

这是我们使用正则化方法L1和L2的代码的一部分,以最终减少过度拟合。 输入“global args”后,我收到错误“没有名为args的模块”。

以下代码使用kwargs并将其转移到另一个函数:

def myprint( kwargs ):
    # default values
    a = kwargs.get('a', None)
    b = kwargs.get('b', None)

    # print both
    print('a={}, b={}'.format(a,b))

def mytest( **kwargs ):
    myprint( kwargs )

mytest()
mytest(b=2)

产量:

a=None, b=None
a=None, b=2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM