Inilah satu pendekatan. Saya tidak akan merekomendasikan ini untuk hal yang penting, karena itu akan sangat rapuh. Tapi itu bisa dilakukan.
Buat fungsi yang menggunakan inspectmodul untuk menemukan kode sumber yang memanggilnya. Kemudian Anda dapat mengurai kode sumber untuk mengidentifikasi nama variabel yang ingin Anda ambil. Misalnya, inilah fungsi yang dipanggil autodictyang mengambil daftar variabel dan mengembalikan kamus nama variabel pemetaan ke nilai-nilai mereka. Misalnya:
x = 'foo'
y = 'bar'
d = autodict(x, y)
print d
Akan memberi:
{'x': 'foo', 'y': 'bar'}
Memeriksa kode sumber itu sendiri lebih baik daripada mencari melalui locals()atau globals()karena pendekatan yang terakhir tidak memberi tahu Anda mana dari variabel yang Anda inginkan.
Bagaimanapun, inilah kodenya:
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
Tindakan terjadi di baris dengan inspect.getouterframes, yang mengembalikan string dalam kode yang dipanggil autodict.
Kelemahan yang jelas untuk jenis sihir ini adalah bahwa ia membuat asumsi tentang bagaimana kode sumber terstruktur. Dan tentu saja, itu tidak akan berfungsi sama sekali jika dijalankan di dalam interpreter.
pip3 install python-varname==0.1.5; diimpor menggunakanfrom varname import nameof