Элегантный способ распаковать ограниченные значения dict в локальные переменные в Python

Я ищу элегантный способ извлечь некоторые значения из файла 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')

Но я продолжаю скрывать подозрение, что есть еще один встроенный способ.

Ответ 1

Вы можете сделать что-то вроде

foo, bar = map(d.get, ('foo', 'bar'))

или

foo, bar = itemgetter('foo', 'bar')(d)

Это может сохранить некоторую типизацию, но по сути это то же самое, что и вы (что хорошо).

Ответ 2

Хорошо, если вы знаете имена раньше времени, вы можете просто сделать то, что вы предлагаете.

Если вы не знаете их раньше времени, тогда придерживайтесь использования dict - для чего они предназначены.

Если вы настаиваете, альтернативой будет:

varobj = object()
for k,v in d.iteritems(): setattr(varobj,k,v)

После чего ключи будут переменными на varobj.

Ответ 3

Несколько ужасно, но:

globals().update((k, v) for k, v in d.iteritems() if k in ['foo', 'bar'])

Обратите внимание, что, хотя это возможно - это то, что вы действительно не хотите делать, поскольку вы будете загрязнять пространство имен, которое должно быть просто оставлено внутри самого dict...

Ответ 4

Элегантное решение:

d = { "foo": 123, "bar": 456, None: 789 }
foo, bar, baz = d.values()  # 123, 456, 789

Обратите внимание, что ключи не используются, поэтому убедитесь, что порядок ваших переменных правильный, т.е. Они должны соответствовать порядку, в котором ключи были вставлены в карту (этот порядок гарантирован начиная с Python 3.6). Если у вас есть сомнения по поводу заказа, используйте другие методы.

Ответ 5

Если вы ищете элегантность с производительностью во всех версиях 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)