Ich möchte den Namen einer Variablen als Zeichenfolge abrufen können, weiß aber nicht, ob Python über so viele Introspektionsfunktionen verfügt. Etwas wie:
>>> print(my_var.__name__)
'my_var'
Ich möchte das tun, weil ich eine Reihe von Variablen habe, die ich in ein Wörterbuch verwandeln möchte, wie:
bar = True
foo = False
>>> my_dict = dict(bar=bar, foo=foo)
>>> print my_dict
{'foo': False, 'bar': True}
Aber ich hätte gerne etwas Automatischeres.
Python haben locals()
und vars()
, also denke ich, gibt es einen Weg.
Antworten:
Versuchst du das zu tun?
Beispiel
quelle
print('x: ' + x)
schreibenmagic_print(x)
und dieselbe Ausgabe haben, ohne den Namen der Variablen zweimal zu schreiben.Wie bereits erwähnt, ist dies in Python nicht wirklich der Fall - Variablen sind tatsächlich Namenszuordnungen zu Objekten.
Allerdings , hier ist eine Möglichkeit , es zu versuchen und zu tun:
quelle
True
möglicherweise ein unbeabsichtigter Variablenname zurückgegeben wird , wenn zwei Variablennamen auf denselben Wert verweisen (z. B. ).id(v) == id(a)
stattv is a
? Dies schlägt bei Objekten fehl, die an mehrere Variablen gebunden sind, z. B. Ints, Strings und ähnlich implementierte benutzerdefinierte Typen.v is a
wäre eine bessere Wahl. Und ja, sicherlich gefährlich angesichts aller möglichen Fallstricke! ;-)Ich wollte das schon ziemlich oft machen. Dieser Hack ist dem Vorschlag von rlotun sehr ähnlich, aber es ist ein Einzeiler, was mir wichtig ist:
Python 3+
quelle
iteritems()
durchitems()
spam = 1; blah = 1; blah_name = [ k for k,v in locals().items() if v is blah][0]; print(blah_name)
Ausgabenspam
spam = 1, blah = 1; assert spam is blah
. Die Lösung bricht beim Vergleich primitiver Datentypen ab.Das ist ein Hack. Es funktioniert nicht auf allen Python-Implementierungsdistributionen (insbesondere auf solchen, die keine haben
traceback.extract_stack
).Beachten Sie, dass dieser Hack zerbrechlich ist:
(Aufruf von make_dict in 2 Zeilen) funktioniert nicht.
Anstatt zu versuchen, das Diktat aus den Werten
foo
und zu generierenbar
, wäre es viel pythonischer, das Diktat aus den Namen der Zeichenfolgenvariablen zu generieren'foo'
und'bar'
:quelle
print("a_very_long_name: {}'.format(a_very_long_name))
wen interessiert das?Dies ist in Python nicht möglich, das wirklich keine "Variablen" hat. Python hat Namen, und es kann mehr als einen Namen für dasselbe Objekt geben.
quelle
Ich denke, mein Problem wird helfen, zu veranschaulichen, warum diese Frage nützlich ist, und es kann ein bisschen mehr Einblick geben, wie man sie beantwortet. Ich habe eine kleine Funktion geschrieben, um verschiedene Variablen in meinem Code schnell inline zu überprüfen. Grundsätzlich werden der Variablenname, der Datentyp, die Größe und andere Attribute aufgelistet, sodass ich Fehler, die ich gemacht habe, schnell erkennen kann. Der Code ist einfach:
Wenn Sie also eine komplizierte Situation mit Wörterbuch / Liste / Tupel haben, ist es sehr hilfreich, wenn der Interpreter den von Ihnen zugewiesenen Variablennamen zurückgibt. Zum Beispiel ist hier ein seltsames Wörterbuch:
Ich bin mir nicht sicher, ob ich das an die richtige Stelle gebracht habe, aber ich dachte, es könnte helfen. Ich hoffe es tut.
quelle
myconnection
auf einen booleschen Wert an einem Punkt, eine Ganzzahl zu einem anderen Zeitpunkt und eine Socket-Verbindung an einem anderen Punkt in der Codeausführung zeigen?Ich habe eine nette kleine nützliche Funktion geschrieben, die auf der Antwort auf diese Frage basiert. Ich setze es hier ein, falls es nützlich ist.
Verwendung:
quelle
Ich finde, wenn Sie bereits eine bestimmte Liste von Werten haben, ist dies der von @S beschriebene Weg. Lotts ist das Beste; jedoch die beschriebene Art und Weise unten funktioniert gut , alle Variablen und Klassen im Code hinzugefügt zu bekommen ohne die Notwendigkeit Variablennamen zur Verfügung zu stellen , obwohl Sie sie angeben können , wenn Sie wollen. Der Code kann erweitert werden, um Klassen auszuschließen.
Ausgabe:
quelle
In Python 3 ist dies einfach
Dies wird gedruckt:
quelle
for v in locals()
.for v in list(locals()):
Python3. Verwenden Sie inspect, um den aufrufenden lokalen Namespace zu erfassen, und verwenden Sie dann die hier vorgestellten Ideen. Kann mehr als eine Antwort zurückgeben, wie bereits erwähnt wurde.
quelle
Hier ist die Funktion, die ich zum Lesen der Variablennamen erstellt habe. Es ist allgemeiner und kann in verschiedenen Anwendungen verwendet werden:
So verwenden Sie es in der angegebenen Frage:
quelle
Beim Lesen des Threads sah ich sehr viel Reibung. Es ist einfach genug, eine schlechte Antwort zu geben und dann jemanden die richtige Antwort geben zu lassen. Wie auch immer, hier ist was ich gefunden habe.
Von: [effbot.org] ( http://effbot.org/zone/python-objects.htm#names )
Die Namen sind etwas anders - sie sind nicht wirklich Eigenschaften des Objekts, und das Objekt selbst weiß nicht, wie es heißt.
Ein Objekt kann eine beliebige Anzahl von Namen oder überhaupt keinen Namen haben.
Namen leben in Namespaces (z. B. einem Modul-Namespace, einem Instanz-Namespace oder dem lokalen Namespace einer Funktion).
Hinweis: Das Objekt selbst weiß nicht, wie es heißt. Das war also der Hinweis. Python-Objekte sind nicht selbstreferenziell. Dann heißt es, Namen leben in Namespaces . Wir haben dies in TCL / TK. Vielleicht hilft meine Antwort (aber sie hat mir geholfen)
Am Ende der Liste steht also 'jj'.
Schreiben Sie den Code wie folgt um:
Dieses böse Stück Code-ID ist der Name der Variablen / des Objekts / wie auch immer-Sie-Pedantics-es nennen.
Also, da ist es. Die Speicheradresse von 'jj' ist dieselbe, wenn wir direkt danach suchen, wie wenn wir das Wörterbuch im globalen Namensraum nachschlagen. Ich bin sicher, Sie können eine Funktion dafür erstellen. Denken Sie daran, in welchem Namespace sich Ihre Variable / Objekt / Wypci befindet.
QED.
quelle
print id(jj)
. Der zweite sucht einfach nach dem Namen und kann einfacher mit durchgeführt werdenvars()
.Vielleicht überdenke ich das aber ..
quelle
variable = 1 \n [k for k,v in locals().items() if id(variable) == id(v)] \n Out[14]: ['variable']
quelle
Ich habe eine Lösung auf pypi hochgeladen . Es ist ein Modul, das ein Äquivalent der C #
nameof
-Funktion definiert.Es durchläuft Bytecode-Anweisungen für den aufgerufenen Frame und erhält die Namen der an ihn übergebenen Variablen / Attribute. Die Namen werden in der gefunden
.argrepr
vonLOAD
Anweisungen folgenden Funktionsnamen.quelle
Ich habe das Paket Zauberei geschrieben , um diese Art von Magie robust zu machen. Du kannst schreiben:
quelle
Die meisten Objekte haben kein Attribut __name__ . (Klassen, Funktionen und Module tun dies; gibt es noch mehr eingebaute Typen, die einen haben?)
Was würden Sie sonst noch erwarten
print(my_var.__name__)
alsprint("my_var")
? Können Sie den String einfach direkt verwenden?Sie könnten ein Diktat "in Scheiben schneiden":
Alternative:
quelle
some_func(var)
, also habe ich versucht, darauf hinzuweisen, dass es nicht weit davon entferntsome_func("var")
ist. Mit dictslice können Sie die Name-Wert-Zuordnung für mehrere Variablen gleichzeitig abrufen .Nun, ich hatte vor ein paar Tagen genau das gleiche Bedürfnis und musste den Namen einer Variablen erhalten, die auf das Objekt selbst zeigte.
Und warum war es so notwendig?
Kurz gesagt, ich habe ein Plug-In für Maya erstellt . Das Kern-Plug-In wurde mit C ++ erstellt, aber die GUI wird über Python gezeichnet (da es nicht prozessorintensiv ist). Da ich bis jetzt nicht weiß, wie man
return
Werte aus dem Plug-In mit Ausnahme der StandardeinstellungMStatus
multipliziert, musste ich zum Aktualisieren eines Wörterbuchs in Python den Namen der Variablen übergeben und auf das Objekt zeigen, das die GUI implementiert und welches enthielt das Wörterbuch selbst, in das Plug-In und verwenden Sie dann dasMGlobal::executePythonCommand()
, um das Wörterbuch aus dem globalen Bereich von Maya zu aktualisieren .Das zu tun, was ich getan habe, war so etwas wie:
Ich weiß, dass es nicht die perfekte Lösung ist, wenn
globals
viele Schlüssel auf dasselbe Objekt zeigen könnten, z.und dass der Ansatz nicht threadsicher ist. Korrigieren Sie mich, wenn ich falsch liege.
Zumindest löste dieser Ansatz mein Problem, indem er den Namen einer Variablen im globalen Bereich abrief, die auf das Objekt selbst zeigte, und es als Argument an das Plug-In weitergab, damit es intern verwendet werden kann.
Ich habe dies anprobiert
int
(die primitive Ganzzahlklasse), aber das Problem ist, dass diese primitiven Klassen nicht umgangen werden (bitte korrigieren Sie die verwendete technische Terminologie, wenn sie falsch ist). Sie könnten neu implementierenint
und dann tunint = foo
,a = 3
werden aber niemals ein Objekt desfoo
Primitiven sein. Um das zu überwinden, muss mana = foo(3)
sicha.name()
an die Arbeit machen.quelle
Mit Python 2.7 und neuer gibt es auch ein Wörterbuchverständnis, das es etwas kürzer macht. Wenn möglich, würde ich getattr anstelle von eval (eval ist böse) wie in der oberen Antwort verwenden. Selbst kann jedes Objekt sein, das den Kontext hat, den Sie betrachten. Es kann ein Objekt sein oder einheimische = einheimische () usw.
quelle
Ich habe an einem ähnlichen Problem gearbeitet. @ S.Lott sagte: "Wenn Sie die Liste der Variablen haben, was bringt es, ihre Namen zu" entdecken "?" Und meine Antwort ist nur zu sehen, ob es möglich ist und ob Sie aus irgendeinem Grund Ihre Variablen nach Typ in Listen sortieren möchten. Bei meinen Recherchen bin ich auf diesen Thread gestoßen, und meine Lösung ist etwas erweitert und basiert auf der @ rlotun-Lösung. Eine andere Sache, sagte @unutbu, "Diese Idee hat ihre Berechtigung, aber beachten Sie, dass, wenn zwei Variablennamen auf denselben Wert verweisen (z. B. True), möglicherweise ein unbeabsichtigter Variablenname zurückgegeben wird." In dieser Übung stimmte das, also habe ich mich damit befasst, indem ich für jede Möglichkeit ein ähnliches Listenverständnis verwendet habe :
isClass = [i for i in isClass if i != 'item']
. Ohne sie würde "item" in jeder Liste angezeigt.quelle
pi = pie
Ihren Code hinzugefügt haben , erhalten Sie einen zusätzlichen Eintrag in IhrerisFloat
Liste. Wenn Sietuple_1[0]
IhrermixedDataTypes
Liste hinzugefügt haben , wird kein Name dafür gefunden, obwohl "eins" zweimal in Ihrem Code enthalten ist (obwohl beide dank der internen Zeichenfolge Verweise auf dasselbe Objekt sind).pi
unde
als Variablen unerwünschte Ausgaben verursacht und dass beide Teil dermath
Bibliothek sind. Für mich war dies nur eine Übung, um zu sehen, ob dies möglich ist, obwohl das Endergebnis nicht perfekt ist. Beim Erlernen dieser Sprache geht das Durchgehen von Büchern nur so weit. Wenn Sie die Sprache wirklich lernen möchten, müssen Sie meiner Meinung nach "Was wäre wenn" spielen und sehen, was Sie sich einfallen lassen.Sie können easydict verwenden
ein anderes Beispiel:
quelle
Unter python3 erhält diese Funktion den äußersten Namen im Stapel:
Es ist überall im Code nützlich. Durchläuft den umgekehrten Stapel und sucht nach dem ersten Match.
quelle
Dies ist wahrscheinlich eine schreckliche Idee, entspricht jedoch der Antwort von rlotun, gibt jedoch häufiger das richtige Ergebnis zurück.
Sie nennen es so:
quelle
sollte Liste bekommen und dann zurückkehren
quelle
Der Name der Variablen wird nicht zurückgegeben, Sie können jedoch problemlos ein Wörterbuch aus einer globalen Variablen erstellen.
quelle
Mit können
python-varname
Sie es einfach tun:pip install python-varname
Haftungsausschluss: Ich bin der Autor dieser Python-Varname-Bibliothek.
quelle
Auf diese Weise erhalten Sie den Variablennamen für ein vielleicht 'a' oder 'b'.
quelle