首页 > 解决方案 > 如何围绕 dict.update() 创建一个同样可以同时采用位置和关键字参数的函数?

问题描述

字典的内置更新函数可以将元组或字典作为参数。我想围绕它创建一个函数,它也可以同时使用元组和字典。

parDict = {}
parDict['a'] = 1
parDict['b'] = 2
parDict['group1.a'] = 3

我可以同时做到:

parDict.update(a=2, b=3)
parDict.update({'group1.a':4})

定义一个函数

def par(**x):
    parDict.update(x)

我可以

par(a=2, b=3)

但我做不到

par({'group1.a' : 4})

错误消息是:par() 接受 0 个位置参数,但给出了 1 个

在我看来 {'group1.a' : 4} 是一个关键字参数(尽管 'group1.a' 不是标识符而是一个字符串。如果我处理另一个参数 {'a': 4}它有一个标识符。

如果我在函数声明中将 par(**x) 更改为 par(x) 那么我可以这样做

par({'group1.a' : 4})

但不是

par(a=2, b=3)

我当然可以做一个别名

par = parDict.update

这适用于两种类型的参数,但我想做更多的事情并且真的需要一个函数(在更新之前进行一些检查)。

我应该如何改进 par() 的参数声明或代码来处理这两种类型的参数?

标签: pythondictionarysyntaxfunction-call

解决方案


如果我理解得很好,这对你有用:

def par(*args, **kwargs):
    ## Merge positional and keyword arguments
    kwargs.update(*args)
    ## Do checks and stuff on kwargs before update
    # ....
    parDict.update(kwargs)

推荐阅读