Hier ist ein Ansatz. Ich würde das für nichts Wichtiges empfehlen, weil es ziemlich brüchig sein wird. Aber es ist möglich.
Erstellen Sie eine Funktion, die das inspect
Modul verwendet, um den Quellcode zu finden, der sie aufgerufen hat. Dann können Sie den Quellcode analysieren, um die Variablennamen zu identifizieren, die Sie abrufen möchten. Zum Beispiel hier eine Funktion namens autodict
, die eine Liste von Variablen akzeptiert und ein Wörterbuch zurückgibt, das die Variablennamen mit ihren Werten verknüpft. Z.B.:
x = 'foo'
y = 'bar'
d = autodict(x, y)
print d
Würde folgendes ergeben:
{'x': 'foo', 'y': 'bar'}
Das Inspektieren des Quellcodes selbst ist besser als das Durchsuchen von locals()
oder globals()
, da der letztere Ansatz nicht sagt, welche der Variablen diejenigen sind, die Sie möchten.
Jedenfalls ist hier der 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
Das Geschehen findet in der Zeile mit inspect.getouterframes
statt, das den String innerhalb des Codes zurückgibt, der autodict
aufgerufen hat.
Der offensichtliche Nachteil dieser Art von Magie besteht darin, dass Annahmen darüber gemacht werden, wie der Quellcode strukturiert ist. Und natürlich funktioniert es überhaupt nicht, wenn es im Interpreter ausgeführt wird.