Cảnh báo 1: như đã nêu trong tài liệu, điều này không được đảm bảo hoạt động trên tất cả các triển khai Python:
Chi tiết triển khai CPython: Hàm này dựa vào hỗ trợ khung ngăn xếp Python trong trình thông dịch, điều này không được đảm bảo tồn tại trong tất cả các triển khai của Python. Nếu chạy trong một triển khai mà không hỗ trợ khung ngăn xếp Python, hàm này trả về Không có.
Cảnh báo 2: hàm này làm cho mã ngắn hơn, nhưng nó có thể mâu thuẫn với triết lý của Python là càng rõ ràng càng tốt. Hơn nữa, nó không giải quyết các vấn đề được John Christopher Jones chỉ ra trong các nhận xét, mặc dù bạn có thể tạo một hàm tương tự hoạt động với các thuộc tính thay vì khóa. Đây chỉ là một minh chứng rằng bạn có thể làm điều đó nếu bạn thực sự muốn!
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'
Giải pháp này cho phép bạn chọn một số khóa, không phải tất cả, như trong JavaScript. Nó cũng an toàn cho từ điển do người dùng cung cấp