Временно распаковать словарь

Скажем, у меня такой дик

my_dictionary = {'a':1,'c':5,'b':20,'d':7} 

Теперь я хочу сделать это с помощью моего dic:

 if my_dictionary['a'] == 1 and my_dictionary['d'] == 7: print my_dictionary['c'] 

Это выглядит смешно, потому что я печатаю my_dictionary 3 раза!

Итак, есть ли какой-либо синтаксис, который позволил бы мне сделать что-то вроде этого:

 within my_dictionary: if a == 1 and d == 7: print c 

Это действительно сработало бы, если бы у меня не было ничего (в данном случае b) в моей книге:

 def f(a,d,c): if a == 1 and d == 7: print cf(**my_dictionary) 

3 Solutions collect form web for “Временно распаковать словарь”

Вы можете изменить свою функцию на

 def f(a,d,c,**args): if a == 1 and d == 7: print c 

то он будет работать, даже если у вас есть другие предметы в dict.

Вы можете использовать operator.itemgetter для минимизации множественного индексирования:

 >>> if operator.itemgetter('a','d')(my_dictionary)==(1,7): ... print operator.itemgetter('c')(my_dictionary) 

И вы можете использовать его в функции:

 >>> def get_item(*args): ... return operator.itemgetter(*args)(my_dictionary) ... >>> >>> if get_item('a','d')==(1,7): ... print get_item('c') ... 5 

Отвечать

Итак, есть ли какой-либо синтаксис, который позволил бы мне сделать что-то вроде этого:

 within my_dictionary: if a == 1 and d == 7: print c 

Вы можете подклассировать dict так, чтобы он имел магические методы. Для этого класс должен иметь __enter__ и __exit__ . Затем вы можете экспортировать ключи в локальную область оператора with и очистить их с помощью метода exit.

Используя этот ответ, я смог создать подкласс, который сделал это:

 import inspect import ctypes locals_to_fast = ctypes.pythonapi.PyFrame_LocalsToFast locals_to_fast.restype = None locals_to_fast.argtypes = [ctypes.py_object, ctypes.c_int] class WithDict(dict): def __enter__(self): frame = self.get_frame() for k,v in self.iteritems(): frame.f_locals[str(k)] = v locals_to_fast(frame, 1) def __exit__(self, exc_type, exc_value, traceback): frame = self.get_frame() for k in self.keys(): del frame.f_locals[str(k)] def get_frame(self): return inspect.getouterframes(inspect.currentframe())[2][0] 

Исходный пример

 my_dictionary = WithDict({'a':1,'c':5,'b':20,'d':7}) with my_dictionary: if a == 1 and d == 7: print c 

отпечатки 5

Переменные удаляются, когда инструкция WITH завершается

  • Почему вы должны вызывать .iteritems () при итерации по словарю в python?
  • Как хранить большой словарь?
  • python 3 map / lambda method с 2 входами
  • Создание словаря Python с использованием понимания
  • Итерировать вложенный словарь в Python
  • доступ к определенным элементам из словаря python
  • Случайный словарь словаря Python, взвешенный по значениям
  • Поиск всех перекрывающихся групп словарных клавиш
  • Python - лучший язык программирования в мире.