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]

2voto

Cees Timmerman Punkte 15076
>>> def varname(v, scope=None):
        d = globals() if not scope else vars(scope); return [k for k in d if d[k] == v]
...
>>> d1 = {'a': 'ape'}; d2 = {'b': 'bear'}; d3 = {'c': 'cat'}
>>> ld = [d1, d2, d3]
>>> [varname(d) for d in ld]
[['d1'], ['d2'], ['d3']]
>>> d5 = d3
>>> [varname(d) for d in ld]
[['d1'], ['d2'], ['d3', 'd5']]
>>> def varname(v, scope=None):
        d = globals() if not scope else vars(scope); return [k for k in d if d[k] is v]
...
>>> [varname(d) for d in ld]
[['d1'], ['d2'], ['d3', 'd5']]

Wie Sie sehen, kann es, wie hier angemerkt wird, mehrere Variablen mit dem gleichen Wert oder sogar der gleichen Adresse geben, daher ist es am besten, einen Wrapper zu verwenden, um die Namen mit den Daten beizubehalten.

1voto

user5828964 Punkte 79

Mit der folgenden Methode wird nicht der Name der Variablen zurückgegeben, aber mit dieser Methode können Sie leicht ein Datenrahmen erstellen, sofern die Variable im globalen Gültigkeitsbereich verfügbar ist.

class CustomDict(dict):
    def __add__(self, other):
        return CustomDict({**self, **other})

class GlobalBase(type):
    def __getattr__(cls, key):
        return CustomDict({key: globals()[key]})

    def __getitem__(cls, keys):
        return CustomDict({key: globals()[key] for key in keys})

class G(metaclass=GlobalBase):
    pass

x, y, z = 0, 1, 2

print('Methode 1:', G['x', 'y', 'z']) # Ergebnis: Methode 1: {'x': 0, 'y': 1, 'z': 2}
print('Methode 2:', G.x + G.y + G.z) # Ergebnis: Methode 2: {'x': 0, 'y': 1, 'z': 2}

A = [0, 1]
B = [1, 2]
pd.DataFrame(G.A + G.B) # Es wird ein Datenrahmen mit den Spalten A und B zurückgeben

1voto

Pablo Manera Punkte 11

Einige der bisherigen Fälle würden scheitern, wenn es zwei Variablen mit dem gleichen Wert gibt. Es ist also praktisch, darauf hinzuweisen:

Funktionsdefinition:

# Variable zu Zeichenkette des Variablennamens

def var_name(variable,i=0):

  results = []
  for name in globals():   
     if eval(name) == variable:
       results.append(name)

  if len(results) > 1:
    print('Warnung:' )
    print('   var_name() hat',len(results), 'mögliche Ergebnisse gefunden.')
    print('   Bitte wählen Sie den geeigneten Parameter "i" aus. Wobei "i" der Index ist,')
    print('   der Ihre Wahl aus der untenstehenden Liste entspricht.')
    print('  ',results) ; print('')

  return results[i]

Verwendung:

var_1 = 10
var_name(var_1) # Ausgabe wird "var_1" sein

Wenn Sie 2 Variablen mit dem gleichen Wert haben, z.B. var_1 = 8 und var_2 = 8, wird eine Warnung angezeigt.

var_1 = 8
var_2 = 8
var_name(var_2)  # Ausgabe wird auch "var_1" sein, aber es wird eine Warnung erscheinen

1voto

hamidipour_AM Punkte 26

Sie können Ihre Variable als kwargs erhalten und sie als String zurückgeben:

var=2
def getVarName(**kwargs):
    return list(kwargs.keys())[0]

print (getVarName(var = var))

Hinweis: Der Variablenname muss mit sich selbst übereinstimmen.

1voto

Karl Knechtel Punkte 55450

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

Das Problem tritt auf, weil Sie über Terminologie, Semantik oder beide verwirrt sind.

"Variablen" gehören nicht in dieselbe Kategorie wie "Funktionen". Eine "Variable" ist kein Ding, das während des Code-Ablaufs Speicherplatz einnimmt. Es handelt sich um nur einen Namen, der in Ihrem Quellcode existiert - damit Sie beim Schreiben des Codes erklären können, über welches Ding Sie sprechen. Python verwendet Namen im Quellcode, um sich auf (d.h., einen Namen für) Werte zu beziehen. (In vielen Sprachen ist eine Variable eher wie ein Name für einen bestimmten Speicherort im Speicher, an dem der Wert gespeichert wird. Aber in Python benennen die Namen tatsächlich das betreffende Ding.)

In Python ist eine Funktion ein Wert. (In einigen Sprachen ist dies nicht der Fall; obwohl Bytes im Speicher verwendet werden, um den tatsächlichen ausführbaren Code darzustellen, handelt es sich nicht um einen diskreten Speicherbereich, mit dem die Programmlogik direkt interagieren kann.) In Python ist jeder Wert ein Objekt, was bedeutet, dass Sie ihm frei Namen zuweisen, ihn als Argument übergeben, ihn aus einer Funktion zurückgeben, usw. können. (In vielen Sprachen ist dies nicht der Fall.) Objekte in Python haben Attribute, auf die Sie mit der . Syntax zugreifen. Funktionen in Python haben ein __name__Attribut, das zugewiesen wird, wenn die Funktion erstellt wird. Speziell, wenn eine def Anweisung ausgeführt wird (in den meisten Sprachen funktioniert die Erstellung einer Funktion ganz anders), wird der Name, der nach def erscheint, als Wert für das __name__Attribut verwendet und auch, unabhängig davon, als Variablenname, der das Funktionsobjekt zugewiesen wird.

Aber die meisten Objekte haben kein solches Attribut.

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

Das ist der Punkt: Sie haben die Variable nicht im Sinne von, wie Sie denken. Sie haben das Objekt, das von dieser Variable benannt wird. Alles andere hängt von den zufällig in einem anderen Objekt gespeicherten Informationen ab - wie z.B. dem locals() der umgebenden Funktion. Es wäre jedoch besser, die Informationen selbst zu speichern. Anstatt sich auf einen Variablennamen zu verlassen, um Informationen für Sie zu tragen, bauen Sie explizit die Zuordnung zwischen dem Zeichenfolgennamen, den Sie für das Objekt verwenden möchten, und dem Objekt selbst.

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