Aquí hay un enfoque. No recomendaría esto para nada importante, porque será bastante frágil. Pero puede hacerse.
Cree una función que use el inspectmódulo para encontrar el código fuente que lo llamó. Luego, puede analizar el código fuente para identificar los nombres de las variables que desea recuperar. Por ejemplo, aquí hay una función llamada autodictque toma una lista de variables y devuelve los nombres de las variables de asignación de diccionario a sus valores. P.ej:
x = 'foo'
y = 'bar'
d = autodict(x, y)
print d
Daría:
{'x': 'foo', 'y': 'bar'}
Inspeccionar el código fuente en sí es mejor que buscar a través de locals()o globals()porque este último enfoque no le dice cuáles de las variables son las que desea.
En cualquier caso, aquí está el código:
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
La acción ocurre en la línea con inspect.getouterframes, que devuelve la cadena dentro del código que llamó autodict.
La desventaja obvia de este tipo de magia es que hace suposiciones sobre cómo está estructurado el código fuente. Y, por supuesto, no funcionará si se ejecuta dentro del intérprete.
pip3 install python-varname==0.1.5; importado usandofrom varname import nameof