İşte bir yaklaşım. Bunu önemli bir şey için tavsiye etmem, çünkü oldukça kırılgan olacak. Ama yapılabilir.
inspectOnu çağıran kaynak kodunu bulmak için modülü kullanan bir işlev oluşturun . Ardından, almak istediğiniz değişken adlarını tanımlamak için kaynak kodunu ayrıştırabilirsiniz. Örneğin, burada autodictdeğişkenlerin listesini alan ve sözlük adlarını değişkenlere değerleriyle eşleyen bir işlev verilmiştir . Örneğin:
x = 'foo'
y = 'bar'
d = autodict(x, y)
print d
Verecek:
{'x': 'foo', 'y': 'bar'}
Kaynak kodun kendisini incelemek locals()veya içinde arama yapmaktan daha iyidir, globals()çünkü ikinci yaklaşım size hangi değişkenlerin hangilerinin istediğiniz olduğunu söylemez .
Her halükarda, kod:
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
Eylem inspect.getouterframes, çağrılan kodun içindeki dizeyi döndüren satırında gerçekleşir autodict.
Bu tür bir büyünün bariz dezavantajı, kaynak kodunun nasıl yapılandırıldığı hakkında varsayımlar yapmasıdır. Ve elbette, tercüman içinde çalıştırılırsa hiç işe yaramaz.
pip3 install python-varname==0.1.5; kullanılarak içe aktarıldıfrom varname import nameof