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

时间:2015-01-21 11:29:26

标签: python python-3.x dictionary scope

我想过以某种方式将字典附加到本地范围,但是我已经看到了类似的问题 - 通常是响应'不要这样做!'。我将说明我的问题,并欢迎任何克服这一点的建议。

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

1 个答案:

答案 0 :(得分:0)

好的,感谢@ 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

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

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

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