Ось один підхід. Я б не рекомендував цього нічого важливого, оскільки він буде досить крихким. Але це можна зробити.
Створіть функцію, яка використовує inspectмодуль для пошуку вихідного коду, який його викликав. Тоді ви можете проаналізувати вихідний код, щоб виявити імена змінних, які ви хочете отримати. Наприклад, ось функція, яка називається autodict, приймає список змінних і повертає словникові відображення імен змінних до їх значень. Наприклад:
x = 'foo'
y = 'bar'
d = autodict(x, y)
print d
Дав би:
{'x': 'foo', 'y': 'bar'}
Перевірка самого вихідного коду краще, ніж пошук через locals()або globals()тому, що останній підхід не підкаже, який із змінних ви шукаєте.
У будь-якому випадку, ось код:
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
Дія відбувається в рядку з inspect.getouterframes, який повертає рядок у коді, який викликавautodict .
Очевидним недоліком цього виду магії є те, що він робить припущення щодо структури вихідного коду. І звичайно, це взагалі не буде працювати, якщо він запускається всередині перекладача.
pip3 install python-varname==0.1.5; імпортовано за допомогоюfrom varname import nameof