В работе, которую я делаю, у меня часто есть параметры, которые мне нужно группировать в подмножества для удобства:
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
Это приводит к трем повторениям для декоратора плюс два за каждую функцию, поэтому лучше, если у вас много функций.
Есть ли лучший способ? Может быть, что-то использует eval? Спасибо!