Kaz*_*azz 1 python dictionary kwargs python-3.x avro
这样构建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...
Run Code Online (Sandbox Code Playgroud)
kwarg是要转到单个可变对象(dict),并且仅将其引用沿流传递,还是将我解压缩并一遍又一遍地创建?
更精确的问题。如果我这样做:
def a(**kwargs):
return b(**kwargs)
def b(**kwargs):
return c(**kwargs)
...
def z(**kwargs):
print(**kwargs)
Run Code Online (Sandbox Code Playgroud)
一次只能有1个字典吗?如果是这样,每次调用都会创建一个新对象吗?还是我将它们堆叠?
实际情况是,我是与AVRO通信的子服务之一。因此,我有一个将二进制文件转换为的软件包dict,然后我需要做一些事情并创建一个新的AVRO。
有些字段在新架构中不存在,有些字段已添加,有些字段只是传递而未触及它们。
因此,我只是接受了第一个字典,一遍又一遍地传递它,添加了越来越多的数据,最后我有了另一个架构,而avro包可以接受如此巨大的字典,并且仅序列化架构中定义的内容。
这样可以吗?
将为每个**kwargs函数中的每个参数构建一个新的字典。这是因为调用 **kwargs语法与函数签名中的语法不同
**kwargsin call会使字典解压缩成单独的关键字参数。**kwargs作为捕获所有参数导致要字典产生从在被传递关键字参数。即使不是这种情况,Python也无法通过共享字典进行优化。函数foo()调用bar()必须处理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
Run Code Online (Sandbox Code Playgroud)
如果词典是共享的,它们的id()价值也将相同。
如果要在函数之间传递共享状态,请显式进行。直接传递字典,例如:
def foo(**state):
state['kw'] = 1
state['wk'] = 2
return bar(state) # kwargs passed in as a single argument
def bar(state):
# etc.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
323 次 |
| 最近记录: |