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

user3495617 Punkte 1

Es ist absolut möglich, den Namen einer Instanzvariable zu erhalten, solange sie Eigenschaft einer Klasse ist.

Ich habe das aus Effective Python von Brett Slatkin. Hoffe es hilft jemandem:

Die Klasse muss die Dunder-Methoden get, set und set_name implementieren, die Teil des "Descriptor Protocol" sind.

Das hat funktioniert, als ich es ausgeführt habe:

class FieldThatKnowsItsName():
    def __init__(self):
        self.name = None
        self._value= None
        self.owner = None

    def __set_name__(self, owner, name):
        self.name = name
        self.owner = owner
        self.owner.fields[self.name] = self

    def __get__(self, instance, instance_type):
        return self

    def __set__(self, instance, value):
        self = value

class SuperTable:
    fields = {}
    field_1=FieldThatKnowsItsName()
    field_2=FieldThatKnowsItsName()

table = SuperTable()
print(table.field_1.name)
print(table.field_2.name)

Sie können dann Methoden hinzufügen und/oder Ihren Datentyp erweitern, wie Sie möchten.

Als Bonus übermittelt auch der set_name(self, owner, name) Dunder die Elterninstanz, sodass die Feldklasseninstanz sich beim Elternteil registrieren kann.

Ich habe das aus Effective Python von Brett Slatkin. Es hat eine Weile gedauert, um herauszufinden, wie man es implementiert.

0voto

étale-cohomology Punkte 1706

Komprimierte Version von iDilips Antwort:

importieren Sie überprüfen
def varname(x):
  return [k für k,v in inspect.currentframe().f_back.f_locals.items() wenn v ist x][0]

hi = 123
drucken(varname(hi))

0voto

Alex Ricciardi Punkte 161

Beim Auffinden des Namens einer Variablen aus ihrem Wert,
können Sie mehrere Variablen haben, die den gleichen Wert haben,
zum Beispiel var1 = 'hello' und var2 = 'hallo'.

Meine Lösung:

def find_var_name(val):

    dict_list = []
    global_dict = dict(globals())

    for k, v in global_dict.items():
        dict_list.append([k, v])

    return [item[0] for item in dict_list if item[1] == val]

var1 = 'hello'
var2 = 'hello'
find_var_name('hello')

Ergebnis

['var1', 'var2']

0voto

Ryan Punkte 1

Ich versuche, den Namen aus den lokalisierten Inspektionen zu erhalten, aber es kann die Variable a[1], b.val nicht verarbeiten. Danach hatte ich eine neue Idee --- den Variablennamen aus dem Code zu erhalten, und ich habe es erfolgreich versucht! Der Code sieht so aus:

# Direkt von der aufgerufenen Funktion abrufen
def retrieve_name_ex(var):
    stacks = inspect.stack()
    try:
        func = stacks[0].function
        code = stacks[1].code_context[0]
        s = code.index(func)
        s = code.index("(", s + len(func)) + 1
        e = code.index(")", s)
        return code[s:e].strip()
    except:
        return ""

0voto

Sandipan Dey Punkte 19520

Sie können Folgendes versuchen, um den Namen einer von Ihnen definierten Funktion abzurufen (funktioniert jedoch nicht für eingebaute Funktionen):

import re
def retrieve_name(func):
    return re.match("

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