在我所做的工作中,为了方便起见,我经常需要将参数分组为子集:
d1 = {'x':1,'y':2}
d2 = {'a':3,'b':4}
我通过传递多个字典来做到这一点。大多数时候我直接使用传递的字典,即:
def f(d1,d2):
for k in d1:
blah( d1[k] )
在某些函数中我需要直接访问变量,事情变得很麻烦;我真的希望这些变量位于本地名称空间中。我希望能够做类似的事情:
def f(d1,d2)
locals().update(d1)
blah(x)
blah(y)
但是 locals() 返回的字典更新并不能保证实际更新命名空间。
这是明显的手动方式:
def f(d1,d2):
x,y,a,b = d1['x'],d1['y'],d2['a'],d2['b']
blah(x)
return {'x':x,'y':y}, {'a':a,'b':b}
这会导致每个函数的参数列表重复三次。这可以通过装饰器自动化:
def unpack_and_repack(f):
def f_new(d1, d2):
x,y,a,b = f(d1['x'],d1['y'],d2['a'],d3['b'])
return {'x':x,'y':y}, {'a':a,'b':b}
return f_new
@unpack
def f(x,y,a,b):
blah(x)
blah(y)
return x,y,a,b
这会导致装饰器重复 3 次,每个函数重复两次,因此如果您有很多函数,那就更好了。
有没有更好的办法?也许使用 eval 的东西?谢谢!