Задать вопрос

Python — как в namespace функции распаковать переменные?

ЕОФ, и в этой функции идёт разбор одного файла конфигурации. Нужно без тонны спагетти-кода как-то распаковать словарь типа {'one':'1', 'two':'2', 'three':'3', 'four':'4'} в локальные переменные в границах этой функции, причём некоторые параметры необязательны. Думал о функции, которая брала бы словарь обязательных аргументов, словарь необязательных и locals(), потом возвращала бы locals с добавленными параметрами, а затем этот ваш возвращённый locals() можно было бы как-то поместить обратно. Типа:

def extract(locals_dict, args, opts, dictionary): #без ловли эксепшенов, просто для примера
    entry_names = [entry['name'] for entry in dictionary]
    for arg in args:
        locals[arg] = dictionary[arg]
    for opt in opts:
        if opt in entry_names:
            locals[opt] = dictionary[opt]

dictionary = config.parse()
print dictionary
#{'arg1':"value in config file with key 'arg1'", ...}
args = ['arg1', 'arg2', 'arg3']
opts = ['opt1', 'opt2', 'opt3']
new_locals = extract(locals(), args, opts, dictionary)
assign_locals(new_locals) #Вот насчёт этого я ничего не знаю =(
print arg1
#Печатает "value in config file with key 'arg1'"


Это возможно? Или мой вариант не по-Питоновски и в Питоне для этого другие методы?
  • Вопрос задан
  • 3351 просмотр
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
Вот здесь: stackoverflow.com/questions/8028708/dynamically-set-local-variable-in-python указывается, что locals менять нельзя. Кроме некоторых извращённых случаев, которые работают далеко не всегда.

Как я понимаю, у Вас есть словарь, притом довольно небольшой, и Вы хотите распаковать его в локальные переменные. Но зачем? Почему бы не обращаться просто к словарю? mydict['myname'] не намного длинней, чем myname.

В принципе, можно использовать OrderedDict для того, чтоб гарантировать порядок значений, и зная этот порядок, написать что-то вроде

myvar1, myvar2 = mydict.values()

Но нужно ли. Потом разбираться в случае появления багов, откуда и что взялось. Explicit is better than implicit.
Ответ написан
Комментировать
@alz
def func(arg1=1, arg2=2, opt1=3, opt2=4, **kwargs):
    print arg1, arg2, opt1, opt2

dct = config.parse()
func(**dct)
Ответ написан
Комментировать
CRImier
@CRImier Автор вопроса
Ну ладно, уговорили, буду работать с ключами словаря =) Просто думал, что так будет красивее, но уже передумал. Плюс было интересно, распростарённая ли это практика =) Спасибо!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы