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]

9voto

Dilip Lilaramani Punkte 1130

Diese Funktion wird den Variablennamen mit seinem Wert ausgeben:

import inspect

def print_this(var):
    callers_local_vars = inspect.currentframe().f_back.f_locals.items()
    print(str([k for k, v in callers_local_vars if v is var][0])+': '+str(var))
***Eingabe & Funktionsaufruf:***
my_var = 10

print_this(my_var)

***Ausgabe**:*
my_var: 10

8voto

blakev Punkte 3826
>>> locals()['foo']
{}
>>> globals()['foo']
{}

Wenn Sie Ihre eigene Funktion schreiben möchten, könnte dies so gemacht werden, dass Sie nach einer in locals definierten Variable suchen und dann globals überprüfen. Wenn nichts gefunden wird, könnten Sie nach id() vergleichen, um zu sehen, ob die Variable auf dieselbe Speicherstelle zeigt.

Wenn Ihre Variable in einer Klasse ist, könnten Sie className.dict.keys() verwenden oder vars(self), um zu sehen, ob Ihre Variable definiert wurde.

6voto

Amr Sharaki Punkte 51

Ich habe eine Methode, und obwohl sie nicht die effizienteste ist ... sie funktioniert! (und sie erfordert keine ausgefallenen Module).

Im Wesentlichen vergleicht sie die ID der Variable mit den IDs der globalen Variablen und gibt dann den Namen des Treffers zurück.

def getVariableName(variable, globalVariables=globals().copy()):
    """ Get Variable Name as String by comparing its ID to globals() Variables' IDs

        args:
            variable(var): Variable to find name for (Obviously this variable has to exist)

        kwargs:
            globalVariables(dict): Copy of the globals() dict (Adding to Kwargs allows this function to work properly when imported from another .py)
    """
    for globalVariable in globalVariables:
        if id(variable) == id(globalVariables[globalVariable]): # If our Variable's ID matches this Global Variable's ID...
            return globalVariable # Return its name from the Globals() dict

4voto

nneonneo Punkte 162093

In Python binden die Schlüsselwörter def und class einen bestimmten Namen an das von ihnen definierte Objekt (Funktion oder Klasse). Ebenso wird Modulen aufgrund eines spezifischen Dateinamens ein Name zugewiesen. In allen drei Fällen gibt es offensichtlich eine Möglichkeit, dem fraglichen Objekt einen "kanonischen" Namen zuzuweisen.

Bei anderen Arten von Objekten kann ein solcher kanonischer Name jedoch möglicherweise einfach nicht existieren. Betrachten Sie beispielsweise die Elemente einer Liste. Die Elemente in der Liste haben keine individuellen Namen, und es ist durchaus möglich, dass der einzige Weg, sie in einem Programm zu referenzieren, darin besteht, Listenzugriffsindizes auf die enthaltende Liste anzuwenden. Wenn eine solche Liste von Objekten an Ihre Funktion übergeben würde, könnten Sie den Werten keine aussagekräftigen Bezeichner zuweisen.

Python speichert den Namen auf der linken Seite einer Zuweisung nicht im zugewiesenen Objekt ab, weil:

  1. Es erfordern würde, festzustellen, welcher Name unter mehreren konkurrierenden Objekten "kanonisch" ist,
  2. Es würde keinen Sinn machen für Objekte, die niemals einem expliziten Variablennamen zugewiesen werden,
  3. Es wäre äußerst ineffizient,
  4. Buchstäblich keine andere Existenzsprache das tut.

Also haben zum Beispiel Funktionen, die mit lambda definiert sind, immer den "Namen" , anstatt einen spezifischen Funktionsnamen.

Der beste Ansatz wäre einfach, den Aufrufer zu bitten, eine (optionale) Liste von Namen zu übergeben. Wenn das Tippen von '...','...' zu umständlich ist, könnten Sie z.B. einen einzelnen String akzeptieren, der eine kommaseparierte Liste von Namen enthält (wie es namedtuple tut).

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}

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