Вот один из подходов. Я не рекомендовал бы это для чего-то важного, потому что это будет довольно хрупким. Но это может быть сделано.
Создайте функцию, которая использует 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