Ecco un approccio. Non lo consiglierei a niente di importante, perché sarà piuttosto fragile. Ma si può fare.
Creare una funzione che utilizza il inspectmodulo per trovare il codice sorgente che lo ha chiamato. Quindi è possibile analizzare il codice sorgente per identificare i nomi delle variabili che si desidera recuperare. Ad esempio, ecco una funzione chiamata autodictche accetta un elenco di variabili e restituisce un dizionario che associa i nomi delle variabili ai loro valori. Per esempio:
x = 'foo'
y = 'bar'
d = autodict(x, y)
print d
Darebbe:
{'x': 'foo', 'y': 'bar'}
Ispezionare il codice sorgente stesso è meglio che cercare attraverso locals()o globals()perché quest'ultimo approccio non ti dice quali delle variabili sono quelle che desideri.
Ad ogni modo, ecco il codice:
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
L'azione avviene nella riga con inspect.getouterframes, che restituisce la stringa all'interno del codice che ha chiamato autodict.
L'ovvio svantaggio di questo tipo di magia è che fa ipotesi su come è strutturato il codice sorgente. E, naturalmente, non funzionerà affatto se viene eseguito all'interno dell'interprete.
pip3 install python-varname==0.1.5; importato utilizzandofrom varname import nameof