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]

0voto

Sajeev A Punkte 15

Ich denke, wenn wir die global.items() oder die local.items() Funktionen verwenden, werden wir den Variablennamen erhalten können. In der aktuellen Situation befinden sich die Dictionaries in einer Liste, daher müssen wir prüfen, ob das Dictionary, das wir als Teil der Iteration erhalten, mit dem Dictionary in der Liste übereinstimmt. Wenn sie übereinstimmen, dann den Namen des Dictionarys erhalten.

# Über alle globalen/lokalen Variablen iterieren

for name, value in locals().items():

    for i, mydict in enumerate(list_of_dicts):

        # Überprüfen, ob der Wert dem interessierenden Dictionary entspricht
        if value is mydict:

            # Den Variablennamen als String ausgeben
            print("Variablenname:", name)

0voto

Richard Parkins Punkte 69

Ich benutze diesen kleinen Code-Schnipsel zum Debuggen von Makros

from inspect import currentframe, getframeinfo_
def p(var): # print variable and its name
    in_fo = getframeinfo(currentframe().f_back)
    co_de = str(in_fo.code_context)
    na_me = co_de[
    co_de.index('(')+1:co_de.index(')')]
    print("Line "+str(in_fo.lineno)+": "
    +na_me+" is "+str(var))

Die ungewöhnlichen Namen mit _ in der Mitte sollen das Risiko der Aliasbildung von 'var' reduzieren. p(r1) ergibt

Line 154: r1 is 13.999013120731464

0voto

am ar Punkte 13

Sie können den Namen der Variablen dynamisch erhalten, indem Sie die Variable 'globals' innerhalb einer Funktion aktualisieren und die innerhalb eines Blocks definierten Variablen verfolgen. Hier ist ein Beispiel:

keys1 = set(globals().keys())
a = 1
b = 1 
c = 2
d = (a,b)
keys2 = set(globals().keys())
vals = [a,b,c,d]
new_keys = [ key for key in new_keys if globals()[key] in vals]
new_keys = keys2.difference(keys1)
new_keys = [ key for key in new_keys if globals()[key] in vals]
print(new_keys)
myg = globals()
for key in new_keys:
    myg[key] = (val,key) # jetzt zeigt die Variable auch auf den Schlüssel
for key in new_keys:
    myg[key] = (globals()[key],key)
# jetzt zeigt die Variable auch auf den Schlüssel
print(a,b,c,d)

Und sobald Sie die Namen Ihrer Variablen haben, können Sie die globals Variable erneut modifizieren, um die Werte der Variablen wiederherzustellen. Dies kann mit einem Kontext-Manager gemacht werden.

Bemerkung, Sie können nicht alle Variablen von globals() ändern, da dies möglicherweise zu Problemen führt. Daher habe ich es auf die Verwendung von Variablen beschränkt, die auf globals definiert sind.

Außerdem ist die vollständige Lösung nicht unbedingt thread-sicher, und die Variablen, die innerhalb des Kontextes definiert sind, müssen freigegeben werden, bevor sie erneut zugewiesen werden, damit "new_keys" zumindest die Namen der neuen Variablen enthält.

0voto

Hong승원 Punkte 112
from __future__ import annotations
import inspect
import pandas as pd

#   
def getVariableName(variable: str) -> (str | Exception):
    callers_local_vars = inspect.currentframe().f_back.f_locals.items()

    df = pd.DataFrame(callers_local_vars)
    df.columns = ['', '']

    try:
        return df[(df[''] == variable)].iloc[0]['']
    except Exception as e:
        return e

test = 'Hello World!'

if __name__ == '__main__':
    print(getVariableName(test))

0voto

wisedesign Punkte 21

Wenn Sie bereits eine Liste von Dataframes haben, wie es in den Kommentaren angegeben ist, ist es leicht genug, diese Liste in eine Liste von Strings umzuwandeln. Anstatt von einer Liste von Variablen zu Strings zu gehen, gehen Sie den anderen Weg, eine Liste von Strings zu Variablen mit der integrierten exec-Funktion kombiniert mit f-strings (vorausgesetzt, dass die Variablen bereits zugewiesen sind, d.h. vel, vol und area sind Variablennamen von vorhandenen pandas Dataframes):

Wenn:

dfstr_list = [
              'vel',
              'vol',
              'area'
             ]

Dies durchläuft die Liste und verwendet jedes Dataframe, um in Excel zu schreiben, und definiert den Blattnamen:

for dfstr in dfstr_list:
    if dfstr in globals():
        exec(f"{dfstr}.to_excel(writer,sheet_name=dfstr)")

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