Đây là một cách tiếp cận. Tôi sẽ không đề xuất điều này cho bất cứ điều gì quan trọng, vì nó sẽ khá dễ vỡ. Nhưng nó có thể được thực hiện.
Tạo một hàm sử dụng inspect
mô-đun để tìm mã nguồn gọi nó. Sau đó, bạn có thể phân tích mã nguồn để xác định tên biến mà bạn muốn lấy. Ví dụ, đây là một hàm được gọi là autodict
danh sách các biến và trả về một tên biến ánh xạ từ điển cho các giá trị của chúng. Ví dụ:
x = 'foo'
y = 'bar'
d = autodict(x, y)
print d
Sẽ cho:
{'x': 'foo', 'y': 'bar'}
Kiểm tra việc mã nguồn của nó là tốt hơn so với tìm kiếm thông qua các locals()
hoặc globals()
vì tiếp cận thứ hai không cho bạn biết đó của các biến là những người bạn muốn.
Ở bất cứ giá nào, đây là mã:
def autodict(*args):
get_rid_of = ['autodict(', ',', ')', '\n']
calling_code = inspect.getouterframes(inspect.currentframe())[1][4][0]
calling_code = calling_code[calling_code.index('autodict'):]
for garbage in get_rid_of:
calling_code = calling_code.replace(garbage, '')
var_names, var_values = calling_code.split(), args
dyn_dict = {var_name: var_value for var_name, var_value in
zip(var_names, var_values)}
return dyn_dict
Hành động xảy ra trong dòng với inspect.getouterframes
, trả về chuỗi trong mã được gọi autodict
.
Nhược điểm rõ ràng của loại phép thuật này là nó đưa ra các giả định về cách cấu trúc mã nguồn. Và tất nhiên, nó sẽ không hoạt động nếu nó chạy bên trong trình thông dịch.
pip3 install python-varname==0.1.5
; được nhập bằngfrom varname import nameof