我想过以某种方式将字典附加到本地范围,但是我已经看到了类似的问题 - 通常是响应'不要这样做!'。我将说明我的问题,并欢迎任何克服这一点的建议。
如果有一个选项字典(从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几天]
答案 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
字典中的未使用的条目。
我个人决定选择第二个解决方案。