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
字典中未使用的条目。
我个人决定选择第二种解决方案。
我考虑过以某种方式将字典附加到本地范围,但是我在 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
字典中未使用的条目。
我个人决定选择第二种解决方案。