我有以下函数,我动态构建了dicts的dict(这里为了简单起见,为了简单而创建了DoD):
import json
def fun(dummyArg1, dummyArg2):
DoD = {'a': {'aa':1, 'ab':2}, 'b': {'ba':3, 'bb':4}, 'c': '5'}
print json.dumps(DoD, sort_keys=True, indent=4)
# FURTHER CODE THAT WILL WORK WITH DoD VARIABLE GOES HERE
In [1]: fun(1,2)
Out[1]:
{
"a": {
"aa": 1,
"ab": 2
},
"b": {
"ba": 3,
"bb": 4
},
"c": "5"
}
是否可以在函数调用期间指定特定的DoD
元素内容?我希望有类似的东西:
fun(dummyArg1, dummyArg2, DoD["b"]["ba"] = "New Value")
我知道有可能,例如通过第0位置为新值的传递列表,第1位是“外”字典键,第2位是“内部”字典键:
import json
lst = ["New Value", "b", "ba"]
def fun(arg1, arg2, additionalParams):
DoD = {'a': {'aa':1, 'ab':2}, 'b': {'ba':3, 'bb':4}, 'c': '5'}
DoD[additionalParams[1]][additionalParams[2]] = additionalParams[0]
print json.dumps(DoD, sort_keys=True, indent=4)
# FURTHER CODE THAT WILL WORK WITH DoD VARIABLE GOES HERE
In [1]: fun(1,2,lst)
Out[1]:
{
"a": {
"aa": 1,
"ab": 2
},
"b": {
"ba": "New Value",
"bb": 4
},
"c": "5"
}
但是你可以看到它不是很健壮(在键'c'
下改变值需要重写功能代码)也不优雅。有更好的方法吗?
加分问题:为什么在作业 "ba"
包含["New Value"]
而不是"New Value"
之后的最后一个示例?
PS:即使动态创建DoD
,也始终会有DoD["b"]["ba"]
元素。
答案 0 :(得分:0)
您可以使用**kwargs
并检查root,即:
import json
def fun(arg1, arg2, root, **additionalParams):
DoD = {'a': {'aa':1, 'ab':2}, 'b': {'ba':3, 'bb':4}, 'c': '5'}
if root:
DoD[root][additionalParams.keys()[0]] = additionalParams.values()[0]
else:
DoD[additionalParams.keys()[0]] = additionalParams.values()[0]
print json.dumps(DoD, sort_keys=True, indent=4)
TEST1:
fun(1,2, root="b", ba = "new value")
输出:
{
"a": {
"aa": 1,
"ab": 2
},
"b": {
"ba": "new value",
"bb": 4
},
"c": "5"
}
TEST2:
fun(1,2, root=None, c = "new value")
输出:
{
"a": {
"aa": 1,
"ab": 2
},
"b": {
"ba": 3,
"bb": 4
},
"c": "new value"
}
注意:您可以在root
中传递**additionalParams
,但您应该考虑不保留传递给该函数的关键字参数中的顺序。
答案 1 :(得分:0)
这是一种设置程序的奇怪方法,但假设你有理由我认为你可能正在寻找splat参数[* args]或[** kwargs]。通过splat参数,您可以获得正式的参数" aka"必需的参数"到函数(本例中为dummyArg1,dummyArg2)然后你的splat arg。所以你的def将是
def fun(dummyArg1,dummyArg2,*args):
您的电话将是
fun(1,2,'abc','def',4,'etc')
在代码中,args将表示为元组= ('abc','def',4,'etc')
然后你可以使用你的元组来整理你的字典:
l = len(args)
if l == 3:
DoD[args[1]][args[2]] = args[0]
elif l == 2:
DoD[args[1]] = args[0]
当然,如果您有非常深的词典,这可能会变得很麻烦,在这种情况下,您可能希望查看更多complex walking methods。