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

2024-09-22 20:34:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把字典附加到本地范围,但是我也看到过类似的问题,通常回答是“不要这样做!”。我将说明我的问题,并欢迎任何建议来克服这一点。你知道吗

如果有一个options字典(从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几天]


Tags: 方法jsondefault字典defitemsmerge建议
1条回答
网友
1楼 · 发布于 2024-09-22 20:34:06

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

# 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

这有定义助手类的缺点,但有一个好处,就是通过opt.前缀的存在,可以清楚地知道哪些变量是用户可定义的选项。此外,调用语法是自然的。你知道吗

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

我个人决定选择第二种解决方案。你知道吗

相关问题 更多 >