419 Stimmen

Den Namen einer Variablen als Zeichenfolge erhalten

Ich habe bereits Wie bekomme ich den Namen einer Funktion als Zeichenfolge? gelesen.

Wie kann ich das Gleiche für eine Variable tun? Im Gegensatz zu Funktionen haben Python-Variablen nicht das Attribut __name__.

Anders ausgedrückt, wenn ich eine Variable wie diese habe:

foo = dict()
foo['bar'] = 2

Suche ich nach einer Funktion/einem Attribut, z.B. retrieve_name(), um ein DataFrame in Pandas aus dieser Liste zu erstellen, wobei die Spaltennamen anhand der Namen der tatsächlichen Dictionaries angegeben sind:

# Liste von Dictionaries für mein DataFrame
list_of_dicts = [n_jobs, users, queues, priorities]
columns = [retrieve_name(d) for d in list_of_dicts]

33voto

korylprince Punkte 2919

Ich glaube nicht, dass dies möglich ist. Betrachten Sie das folgende Beispiel:

>>> a = []
>>> b = a
>>> id(a)
140031712435664
>>> id(b)
140031712435664

Die a und b zeigen auf dasselbe Objekt, aber das Objekt kann nicht wissen, auf welche Variablen es zeigt.

18voto

Anshu Pandey Punkte 189
>> my_var = 5
>> my_var_name = [ k for k,v in locals().items() if v == my_var][0]
>> my_var_name 
'my_var'

Falls ein Fehler auftritt, wenn myvar auf eine andere Variable zeigt, versuchen Sie es mit folgendem (vorgeschlagen von @mherzog)-

 >> my_var = 5
>> my_var_name = [ k for k,v in locals().items() if v is my_var][0]
>> my_var_name 
'my_var'

locals() - Gibt ein Dictionary zurück, das die lokalen Variablen des aktuellen Scopes enthält. Durch Iteration über dieses Dictionary können wir den Schlüssel prüfen, der einen Wert hat, der der definierten Variable entspricht. Nur die Extraktion des Schlüssels gibt uns den Namen der Variablen im Stringformat.

aus (nach einigen Änderungen) https://www.tutorialspoint.com/How-to-get-a-variable-name-as-a-string-in-Python

16voto

fdvfcges Punkte 402
def name(**variables):
    return [x for x in variables]

Es wird wie folgt verwendet:

name(variable=variable)

14voto

Alex Hall Punkte 33250

Ich habe das Paket Sorcery geschrieben, um diese Art von Magie robust auszuführen. Du kannst schreiben:

from sorcery import dict_of

columns = dict_of(n_jobs, users, queues, priorities)

und das dem DataFrame-Konstruktor übergeben. Es entspricht:

columns = dict(n_jobs=n_jobs, users=users, queues=queues, priorities=priorities)

9voto

Zachary Ernst Punkte 91

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X