Skip to main content
 首页 » 编程设计

python的**kwargs效率

2025年05月04日20leader

这样构建python3流程可以吗?

def foo(**kwargs): 
    kwargs['kw'] = 1 
    return bar(**kwargs, wk=2) 
def bar(**kwargs): 
    process(1,2,'sss',**kwargs) 
    for i in kwargs: 
        print(i) 
...etc... 

kwargs 是否会成为单个可变对象 (dict),并且只有它的引用会被传递到流程中,还是我会被解压并一遍又一遍地创建?

更精确的问题。如果我这样做:

def a(**kwargs): 
    return b(**kwargs) 
def b(**kwargs): 
    return c(**kwargs) 
... 
def z(**kwargs): 
    print(**kwargs) 

一次只能有 1 个 dict 吗?如果是这样,每次调用都会创建新对象吗? 或者我会堆叠它们吗?

实际情况是我是与AVRO通信的子服务之一。所以我有一个包可以将该二进制文件转换为 dict,然后我需要做一些事情并创建一个新的 AVRO。

有些字段在新模式中不存在,有些是添加的,有些只是通过而不触及它们。

所以我只是拿了第一个字典,一遍又一遍地传递它,添加越来越多的数据,然后最后我有了另一个模式,而 avro 包可以接受如此巨大的字典,并且只序列化模式中定义的内容。

这种方法可以吗?

请您参考如下方法:

为每个函数中的每个 **kwargs 参数构建一个新字典。这是因为 call **kwargs 语法与函数签名中的语法不同

  • 在调用中使用 **kwargs 会导致字典被解压为单独的关键字参数。
  • 使用 **kwargs 作为包罗万象的参数会根据传入的关键字参数生成字典。

即使不是这种情况,Python 也无法通过共享字典进行优化。调用 bar() 的函数 foo() 必须处理传递给调用的字典 kwargs 可能发生变异的可能性。

所以,不,在一系列连接的函数中使用 **kwargs 不会提高效率。

一个快速演示,展示传递给一系列函数的字典是不同的:

>>> def a(**kwargs): 
...     print('a', id(kwargs)) 
...     b(**kwargs) 
... 
>>> def b(**kwargs): 
...     print('b', id(kwargs)) 
... 
>>> a(foo='bar') 
a 4556474552 
b 4557517304 

如果字典是共享的,它们的 id() 值也会相同。

如果您想在函数之间传递共享状态,请显式地进行。直接传递字典,例如:

def foo(**state): 
    state['kw'] = 1 
    state['wk'] = 2 
    return bar(state)  # kwargs passed in as a single argument 
 
def bar(state): 
    # etc.