Python 方便地将字典参数传递给函数

Python convenient passing of dictionary arguments to function

我考虑过以某种方式将字典附加到本地范围,但是我在 SO 上看到了类似的问题 - 通常的回答是“不要这样做!”。我会说明我的问题,欢迎提出任何建议来解决这个问题。

如果有一个选项字典(从 JSON 中读取,所以我不想把它弄得太多)并且我决定按如下方式传递它;

def testParse(dataObj, userOptions):

    # Merge default with passed options taking prescidence
    defaultOpts = {

        'boxheight' : 200,
        'boxwidth'  : 100,
        'padding'   : 150

    }
    opt = dict(userOptions.items() | defaultOpts.items())

问题是;有没有办法使用键将字典中的每个值附加到本地范围,而不是复制整个字典

boxheight = opt['boxheight']

等等,或者每次引用的时候写opt['boxheight']。我可以只循环 opt 字典并以编程方式分配值吗?

我绝不认同所概述的方法,但所有选项都将在某些时候用于本地表达式,并且它们从一开始就作为字典存在。非常感谢您的建议。

[免责声明:只与 Python 合作了几天]

好的,感谢@jonrshapre 的评论,我有以下解决方案

# user options
userOps = { 'name' : 'joe', 'age' : 21 }
data = (1,2)

# default options specified as function argument
def _func(data, name, lovesSO = True, **kwargs):

    print(data)
    print(name)
    print(lovesSO)
    print(kwargs)

# Call
_func(data, **userOps)    

# OUTPUTS
# (1,2)
# joe
# True
# {'age' : 21}

用这种方法付出的代价似乎是调用语法略有不同(尽管正如评论中指出的那样,这对像我这样的新手来说并不常见)。然而,这可以通过定义

来解决
def func(data, options): _func(data, **options)

或基于@Sven Marnach 评论的另一种解决方案;

# Utility options class
class Options:
    def __init__(self, defaults, user_opts):
        vars(self).update(defaults)
        vars(self).update(user_opts)

def func2(data, userOps):

    opt = Options({ 'lovesSO' : True}, userOps)

    print(data)
    print(opt.name)
    print(opt.lovesSO)

# Call    
func2(data, userOps)

# OUTPUT
# (1, 2)
# joe
# True

这有定义辅助函数 class 的缺点,但好处是可以通过 opt. 前缀清楚地知道哪些变量是用户可定义的选项。另外调用语法很自然。

在这两种情况下,未使用的用户选项都存储为 kwargs 字典(第一种情况)或 opt 字典中未使用的条目。

我个人决定选择第二种解决方案。