Ответ 1
Вы можете сделать что-то вроде
foo, bar = map(d.get, ('foo', 'bar'))
или
foo, bar = itemgetter('foo', 'bar')(d)
Это может сохранить некоторую типизацию, но по сути это то же самое, что и вы (что хорошо).
Я ищу элегантный способ извлечь некоторые значения из файла Python в локальные значения.
Что-то эквивалентное этому, но более чистое для более длинного списка значений и для более длинных имен ключей/переменных:
d = { 'foo': 1, 'bar': 2, 'extra': 3 }
foo, bar = d['foo'], d['bar']
Я изначально надеялся на что-то вроде следующего:
foo, bar = d.get_tuple('foo', 'bar')
Я могу легко написать функцию, которая неплоха:
def get_selected_values(d, *args):
return [d[arg] for arg in args]
foo, bar = get_selected_values(d, 'foo', 'bar')
Но я продолжаю скрывать подозрение, что есть еще один встроенный способ.
Вы можете сделать что-то вроде
foo, bar = map(d.get, ('foo', 'bar'))
или
foo, bar = itemgetter('foo', 'bar')(d)
Это может сохранить некоторую типизацию, но по сути это то же самое, что и вы (что хорошо).
Хорошо, если вы знаете имена раньше времени, вы можете просто сделать то, что вы предлагаете.
Если вы не знаете их раньше времени, тогда придерживайтесь использования dict - для чего они предназначены.
Если вы настаиваете, альтернативой будет:
varobj = object()
for k,v in d.iteritems(): setattr(varobj,k,v)
После чего ключи будут переменными на varobj.
Несколько ужасно, но:
globals().update((k, v) for k, v in d.iteritems() if k in ['foo', 'bar'])
Обратите внимание, что, хотя это возможно - это то, что вы действительно не хотите делать, поскольку вы будете загрязнять пространство имен, которое должно быть просто оставлено внутри самого dict
...
Элегантное решение:
d = { "foo": 123, "bar": 456, None: 789 }
foo, bar, baz = d.values() # 123, 456, 789
Обратите внимание, что ключи не используются, поэтому убедитесь, что порядок ваших переменных правильный, т.е. Они должны соответствовать порядку, в котором ключи были вставлены в карту (этот порядок гарантирован начиная с Python 3.6). Если у вас есть сомнения по поводу заказа, используйте другие методы.
Если вы ищете элегантность с производительностью во всех версиях Python, к сожалению, я не думаю, что вы станете лучше, чем:
unpack = lambda a,b,c,**kw: (a,b,c) # static
d = dict( a=1, b=2, c=3, d=4, e=5 )
a,b,c = unpack(**d)