Voici une approche. Je ne recommanderais pas cela pour quelque chose d'important, car ce sera assez fragile. Mais cela peut être fait.
Créez une fonction qui utilise le inspectmodule pour trouver le code source qui l'a appelé. Ensuite, vous pouvez analyser le code source pour identifier les noms de variables que vous souhaitez récupérer. Par exemple, voici une fonction appelée autodictqui prend une liste de variables et renvoie un dictionnaire mappant les noms de variables à leurs valeurs. Par exemple:
x = 'foo'
y = 'bar'
d = autodict(x, y)
print d
Donnerait:
{'x': 'foo', 'y': 'bar'}
Inspecter le code source lui-même est préférable à une recherche dans le locals()ou globals()parce que cette dernière approche ne vous dit pas quelles variables sont celles que vous souhaitez.
En tout cas, voici le code:
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'action se produit dans la ligne avec inspect.getouterframes, qui renvoie la chaîne dans le code qui a appelé autodict.
L'inconvénient évident de ce type de magie est qu'elle émet des hypothèses sur la structure du code source. Et bien sûr, cela ne fonctionnera pas du tout s'il est exécuté dans l'interpréteur.
pip3 install python-varname==0.1.5; importé en utilisantfrom varname import nameof