【发布时间】:2015-01-21 11:29:25
【问题描述】:
我曾想过以某种方式将字典附加到本地范围,但是我看到在 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 几天]
【问题讨论】:
-
不,没有办法对局部变量执行此操作。字典中有多少项目?我建议明确分配。
-
解决这个问题的最简单方法是给子函数添加关键字参数,然后将字典解压到调用中(例如,
def func(padding, **kwargs)然后func(**opt)将使padding在@ 本地可用987654328@ 并将其他所有内容打包到kwargs)。 -
@jonrsharpe - 漂亮!
-
另一种选择是使用命名空间对象
class Namespace: pass。这可以用作opt = Namepsace(); vars(opt).update(defaultOptions); vars(opt).update(userOptions)。之后,您可以使用opt.boxheight访问 opts,您可能会发现它的语法噪音较小。 -
作为一个侧节点,如果一个键同时出现在
userOptions和defaultOpts中,您构建合并字典的方式会导致选择任意值。
标签: python python-3.x dictionary scope