Đó là không phải là rất Pythonic, nhưng nếu bạn thực sự phải:
import inspect
def compact(*names):
caller = inspect.stack()[1][0] # caller of compact()
vars = {}
for n in names:
if n in caller.f_locals:
vars[n] = caller.f_locals[n]
elif n in caller.f_globals:
vars[n] = caller.f_globals[n]
return vars
def extract(vars):
caller = inspect.stack()[1][0] # caller of extract()
for n, v in vars.items():
caller.f_locals[n] = v # NEVER DO THIS - not guaranteed to work
Tôi đã sử dụng những triển khai khá một chút, và họ làm việc, nhưng về mặt kỹ thuật sửa đổi f_locals
không được hỗ trợ.
Nghiêm túc, nếu bạn thực sự cảm thấy bạn có nhu cầu sử dụng các chức năng này, có thể bạn đang làm điều gì sai. Dường như nó chạy trên Python's philosophy trên ít nhất ba lần: "rõ ràng là tốt hơn ngầm", "đơn giản hơn là phức tạp", "nếu việc triển khai khó giải thích, đó là một ý tưởng tồi", có thể nhiều hơn (và thực sự, nếu bạn có đủ kinh nghiệm trong Python bạn biết rằng những thứ như thế này không được thực hiện). Tôi có thể thấy nó hữu ích cho một trình gỡ rối hoặc phân tích sau giết mổ, hoặc có lẽ đối với một số loại khung hình rất chung chung thường xuyên cần tạo biến có tên và giá trị được chọn động, nhưng đó là một đoạn.
Nếu bạn định sử dụng các chức năng này, ít nhất bạn nên giữ các biến số extract
ed chứa trong phạm vi nhỏ. Bọc chúng vào các chức năng mà bạn có thể coi là "hộp đen". Lý do chính extract
là xấu là nó đặt các biến trong bảng biểu tượng của bạn theo cách không rõ ràng từ việc kiểm tra mã. Nếu bạn giữ các hiệu ứng của các biến được bản địa hóa thành một hàm rất nhỏ, và giải thích những gì bạn đang làm với mã và nhận xét rõ ràng, nó không phải là vấn đề lớn.
Nguồn
2009-04-23 22:47:46
Ok, tôi nghĩ tôi thấy điều gì khiến tôi khó hiểu. Có vẻ như dòng 3 của bạn phải là "$ a = nhỏ gọn ('foo', 'bar');" thay thế. – pantsgolem
oops, cảm ơn. Tôi vừa sửa nó. – Turadg
Tôi có thể hỏi tại sao bạn thấy chúng tiện dụng không? Tôi không thấy những gì họ tốt cho rằng không thể được thực hiện sạch sẽ hơn bằng cách sử dụng hashtables. –