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]

4voto

Joe Camel Punkte 49

Ich denke, es ist so schwierig, dies in Python zu tun, aufgrund der einfachen Tatsache, dass man nie den Namen der verwendeten Variable nicht kennen wird. Also könnte man in seinem Beispiel folgendes tun:

Statt:

list_of_dicts = [n_jobs, users, queues, priorities]

dict_of_dicts = {"n_jobs" : n_jobs, "users" : users, "queues" : queues, "priorities" : priorities}

3voto

ses Punkte 83

Nur eine andere Möglichkeit, dies auf der Grundlage des Inhalts der Eingabevariablen zu tun:

(es gibt den Namen der ersten Variablen zurück, die mit der Eingabevariablen übereinstimmt, andernfalls None. Man kann es ändern, um alle Variablennamen zu erhalten, die den gleichen Inhalt wie die Eingabevariable haben)

def retrieve_name(x, Vars=vars()):
    for k in Vars:
        if isinstance(x, type(Vars[k])):
            if x is Vars[k]:
                return k
    return None

2voto

Guy Vandegrift Punkte 21

Wenn das Ziel darin besteht, Ihnen zu helfen, den Überblick über Ihre Variablen zu behalten, können Sie eine einfache Funktion schreiben, die die Variable benennt und ihren Wert und Typ zurückgibt. Nehmen wir an, i_f=3,01 und Sie runden sie auf eine ganze Zahl namens i_n ab, um sie in einem Code zu verwenden, und dann benötigen Sie einen String i_s, der in einen Bericht aufgenommen wird.

def wasist(string, x):
    print(string+' Wert=',repr(x),type(x))
    return string+' Wert='+repr(x)+repr(type(x))
i_f=3,01
i_n=int(i_f)
i_s=str(i_n)
i_l=[i_f, i_n, i_s]
i_u=(i_f, i_n, i_s)

## Bericht erstellen, der alle Typen identifiziert
bericht='\n'+20*'#'+'\nDies ist der Bericht:\n'
bericht+= wasist('i_f ',i_f)+'\n'
bericht+=wasist('i_n ',i_n)+'\n'
bericht+=wasist('i_s ',i_s)+'\n'
bericht+=wasist('i_l ',i_l)+'\n'
bericht+=wasist('i_u ',i_u)+'\n'
print(bericht)

Dies wird bei jedem Aufruf zum Debuggen auf das Fenster gedruckt und liefert auch einen String für den schriftlichen Bericht. Der einzige Nachteil ist, dass Sie jedes Mal, wenn Sie die Funktion aufrufen, die Variable zweimal eingeben müssen.

Ich bin ein Python-Neuling und fand diese Methode sehr nützlich, um meine Bemühungen zu protokollieren, während ich programmiere und versuche, mit allen Objekten in Python umzugehen. Ein Fehler ist, dass das wasist() versagt, wenn es eine außerhalb des Verfahrens beschriebene Funktion aufruft. Zum Beispiel war int(i_f) nur deshalb ein gültiger Funktionsaufruf, weil die int-Funktion Python bekannt ist. Sie könnten wasist() mit int(i_f**2) aufrufen, aber wenn Sie aus irgendeinem seltsamen Grund beschließen, eine Funktion namens int_squared zu definieren, muss sie innerhalb des Verfahrens deklariert werden, in dem wasist() verwendet wird.

2voto

Reitsch-Z2 Punkte 21

Vielleicht könnte das nützlich sein:

def Retriever(bar):
    return (list(globals().keys()))[list(map(lambda x: id(x), list(globals().values()))).index(id(bar))]

Die Funktion durchläuft die Liste der IDs der Werte aus dem globalen Bereich (der Namespace könnte bearbeitet werden), findet den Index der gesuchten/benötigten Variable oder Funktion basierend auf ihrer ID und gibt dann den Namen aus der Liste der globalen Namen basierend auf dem erworbenen Index zurück.

2voto

rusty Punkte 582

Immer wenn ich es machen muss, hauptsächlich beim Kommunizieren von JSON-Schema und Konstanten mit dem Frontend, definiere ich eine Klasse wie folgt:

class Param:
    def __init__(self, name, value):
        self.name = name
        self.value = value

Dann definiere die Variable mit Name und Wert.

frame_folder_count = Param({'name':'frame_folder_count', 'value':10})

Jetzt kannst du auf den Namen und Wert über das Objekt zugreifen.

>>> frame_folder_count.name
'frame_folder_count'

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