Ostrzeżenie 1: jak stwierdzono w dokumentacji, nie ma gwarancji, że będzie to działać na wszystkich implementacjach Pythona:
Szczegóły implementacji CPythona: ta funkcja opiera się na obsłudze ramek stosu Pythona w interpreterach, co nie jest gwarantowane we wszystkich implementacjach Pythona. Jeśli działa w implementacji bez obsługi ramek stosu Pythona, ta funkcja zwraca wartość None.
Ostrzeżenie 2: ta funkcja skraca kod, ale prawdopodobnie jest sprzeczna z filozofią Pythona polegającą na byciu tak jednoznacznym, jak to tylko możliwe. Co więcej, nie rozwiązuje problemów wskazanych przez Johna Christophera Jonesa w komentarzach, chociaż możesz stworzyć podobną funkcję, która będzie działać z atrybutami zamiast kluczy. To tylko demonstracja, że możesz to zrobić, jeśli naprawdę chcesz!
def destructure(dict_):
if not isinstance(dict_, dict):
raise TypeError(f"{dict_} is not a dict")
parent_frame = inspect.currentframe().f_back
(line,) = inspect.getframeinfo(parent_frame).code_context
lvalues, _equals, _rvalue = line.strip().partition("=")
keys = [s.strip() for s in lvalues.split(",") if s.strip()]
if missing := [key for key in keys if key not in dict_]:
raise KeyError(*missing)
for key in keys:
yield dict_[key]
In [5]: my_dict = {"hello": "world", "123": "456", "key": "value"}
In [6]: hello, key = destructure(my_dict)
In [7]: hello
Out[7]: 'world'
In [8]: key
Out[8]: 'value'
To rozwiązanie pozwala na wybranie niektórych kluczy, a nie wszystkich, jak w JavaScript. Jest również bezpieczny dla słowników dostarczanych przez użytkowników