Seite 1 von 1

Mit String auf Variable verweisen

Verfasst: Sonntag 19. April 2015, 17:51
von darksharky
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 :)

Re: Mit String auf Variable verweisen

Verfasst: Sonntag 19. April 2015, 17:55
von darktrym
Suchst du locals()?

Re: Mit String auf Variable verweisen

Verfasst: Sonntag 19. April 2015, 18:11
von Sirius3
@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()])

Re: Mit String auf Variable verweisen

Verfasst: Sonntag 19. April 2015, 21:23
von darksharky
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 :)

Re: Mit String auf Variable verweisen

Verfasst: Sonntag 19. April 2015, 21:36
von 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.

Re: Mit String auf Variable verweisen

Verfasst: Sonntag 19. April 2015, 21:47
von darksharky
@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 :)

Re: Mit String auf Variable verweisen

Verfasst: Sonntag 19. April 2015, 22:05
von snafu
@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.

Re: Mit String auf Variable verweisen

Verfasst: Sonntag 19. April 2015, 22:09
von Ene Uran
Vielleicht sowas ...

Code: Alles auswählen

# use the local variable dictionary vars() to create new variables
food = 'bread'
vars()[food] = 123
print(bread)  # --> 123

Re: Mit String auf Variable verweisen

Verfasst: Sonntag 19. April 2015, 22:11
von snafu
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.

Re: Mit String auf Variable verweisen

Verfasst: Montag 20. April 2015, 18:02
von darksharky
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 ?

Re: Mit String auf Variable verweisen

Verfasst: Montag 20. April 2015, 18:26
von 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?