Вы можете сделать что-то вроде следующего:
a, b, c, d, e = range(5)
arg_dict = lambda l: dict((k, globals()[k]) for k in l.split(', '))
arg_dict('a, b, c, d, e') => {'a': 0, 'c': 2, 'b': 1, 'e': 4, 'd': 3}
, поэтому вы можете вызывать свою функцию следующим образом:
f(**arg_dict('a, b, c, d, e'))
Это дает вам возможность точно указать, какие переменные вы хотите использовать. Альтернативный метод для этого, который не использует globals()
, мог бы использовать eval()
, но это могло бы сделать использование лямбды потенциально небезопасным.
arg_dict = lambda l: dict(zip(l.split(', '), eval(l)))
Если вы предпочитаете передать locals()
в качестве аргумента вместо использования globals()
в лямбда-выражении, вы можете использовать следующее:
arg_dict = lambda l, d=locals(): dict((k, d[k]) for k in l.split(', '))
f(**arg_dict('a, b, c, d, e'))
Спасибо senderle за locals()
предложений.