Mit String auf Variable verweisen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
darksharky
User
Beiträge: 6
Registriert: Sonntag 19. April 2015, 17:31

Hallo liebe Programmierkollegen :)

Ich habe eine kleine Frage an euch da ich mich selbst noch nicht so lange mit programmieren
beschäftige und ich dazu leider im Internet bzw Suchfunktion nichts dazu finde.
Ist es möglich mit einem String auf den Inhalt einer Variable zu verweisen ?

Ein kleiner abschnitt aus meinem Code als Beispiel:

KEY_M = 0x4D
ab = "m"
ab2 = "KEY_"+str.upper(ab)
print(ab2)

print(KEY_M)

Es geht um das Attribute im ersten print gibt es eine möglichkeit mit der variable ab2 an den Inhalt der Variable KEY_M zu kommen ?
So das im hier gezeigtem Beispiel bei beidem print befehlen die gleiche ausgabe erfolgt ?

Es wäre sehr nett wenn ihr mir hier helfen würdet ich bedanke mich schonmal im voraus :)
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Suchst du locals()?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@darksharky: für eine Zuordnung Name -> Wert gibt es einen eigenen Typ: Wörterbuch, oder englisch dictionary oder kurz dict. Da das KEY überflüssig scheint, habe ich es im Beispiel gleich weggelassen:

Code: Alles auswählen

keys = {
    "m": 0x4D,
}
ab = "m"
print(keys[ab.upper()])
darksharky
User
Beiträge: 6
Registriert: Sonntag 19. April 2015, 17:31

danke für eure hilfe die Funktion die ich gesucht habe war eval()

also:

KEY_M = 0x4D
ab = "m"
ab2 = "KEY_"+str.upper(ab)
print(eval(ab2))

print(KEY_M)

Danke euch schönen abend noch :)
BlackJack

@darksharky: Nein das war ganz sicher nicht die Funktion. Das ist so gut wie *immer* die falsche ”Lösung”, weil man dann irgendetwas *sehr* komisches machen will oder weil man Python nicht weit genug verstanden hat um die normale Lösung zu kennen. Warum kannst Du nicht einfach ein Wörterbuch benutzen? Dafür sind die gedacht.
darksharky
User
Beiträge: 6
Registriert: Sonntag 19. April 2015, 17:31

@Blackjack:Mir ist durchaus bewusst das es vielleicht einen besseren Weg gibt aber ich will auf vorhandene einträge referenzieren wie zb ( KEY_M = 0x4D ) und keine neuen in einem Wörterbuch
erstellen und die eval () Funktion scheint hier zu funktionieren wie ich es mir vorgestellt habe.

Aber ich lasse mich gern belehren wenn es hierfür einen besseren weg gibt

Danke auch für deinen beitrag Blackjack :)
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@darksharky: Dir scheint es ja darum zu gehen, dynamisch auf bestimmte Konstanten zuzugreifen. Sind diese Konstanten im selben Modul definiert wie der Code zum Abfragen der Konstante? Andernfalls kann man nämlich folgendes machen:

Code: Alles auswählen

getattr(modul_mit_konstanten, 'KEY_' + buchstabe)
Im selben Modul wird es etwas umständlicher, da man nichts passendes als ersten Parameter für die `getattr()`-Funktion verwenden kann. Hier würde man dann, wie ja schon vorgeschlagen wurde, auf `globals()` zugreifen.

`eval()` ist - wie BlackJack schon schrieb - etwas, das meistens von Programmierern verwendet wird, wenn sie nicht wissen, wie es besser geht. `eval()` deutet fast immer auf schlechten Programmierstil hin. Es mag funktionieren, ist aber unschön und auch nicht ganz ungefährlich, da die Möglichkeit besteht, auch Schadcode einzuschleusen, mit dem du an der Stelle gar nicht rechnest. `eval()` kann also auch eine potenzielle Sicherheitslücke für dein Programm darstellen.
Ene Uran
User
Beiträge: 125
Registriert: Sonntag 17. September 2006, 20:14
Wohnort: Hollywood

Vielleicht sowas ...

Code: Alles auswählen

# use the local variable dictionary vars() to create new variables
food = 'bread'
vars()[food] = 123
print(bread)  # --> 123
Atomkraftwerkaktienbesitzer
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Achja, `vars()` hatte ich vergessen. Das würde natürlich auch gehen.

Wobei ich wahrscheinlich trotzem `globals()` bevorzugen würde. Ist zwar vom Ergebnis auf Modulebene das gleiche, aber es drückt expliziter aus, was man will. Und innerhalb einer Funktion (wo die Abfrage normalerweise auch hingehört), muss man sogar `globals()` verwenden, wenn man an die Konstanten des Moduls ran will.
darksharky
User
Beiträge: 6
Registriert: Sonntag 19. April 2015, 17:31

Danke nochmals für die vielen Anworten ich habe jetzt nochmal ein wenig herumprobiert
und das folgende Beispiel liefert die gleichen Ergebnisse wie eval() :

Code: Alles auswählen

KEY_M = 0x4D
ab = "m"
ab2 = "KEY_"+str.upper(ab)
print(globals()[ab2])

print(KEY_M)
ist es so den ein besserer Weg ?
BlackJack

@darksharky: Besser als `eval()` aber irgendwie immer noch komisch. Was ist denn das tatsächliche Problem das Du versuchst zu lösen? Warum erstellst Du nicht einfach ein Wörterbuch und Schlüssel ohne den `KEY_*`-Präfix, so wie Sirius3 das ja schon gezeigt hat?
Antworten