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

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

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 завершается

  • Заменить аббревиатурами словаря на Python
  • Как добавить элемент в верхней части OrderedDict в python?
  • Создание словаря из XML-файла
  • Преобразовать объект csv.DictReader в список словарей?
  • Преобразование строки в упорядоченный словарь?
  • Найти целочисленного ближайшего соседа в dict
  • как создать словарь, используя два списка в python?
  • Почему 008 и 009 недействительные ключи для Python dicts?
  • Доступ к элементу dict_keys по индексу в Python3
  • Объединение словарей из массивов numpy различной длины (избегая, если возможно, ручных петель)
  • Искать словарь Python, где значение указано
  • Python - лучший язык программирования в мире.