Dynamischem Variablennamen einen Wert zuweisen

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.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

alexander255 hat geschrieben:Hallo,

Ich weiß nicht vielleicht eine Einsteiger? Egal...
Wie kann man (dynamische) Elemente aus einem Dict nach dem
dictschlüssel = dictwert
lokal in ein Modul einfügen?

HAA Alexander :?:
Auf die Gefahr hin, dass ich mich mit dieser Lösung wieder arg unbeliebt mache:

Code: Alles auswählen

>>> dic = {"a":1, "b":2}
>>> for i in dic:
	exec("%s = dic[%s]" % (i, repr(i)))

>>> a
1
>>> b
2
Funktioniert natürlich nur vernünftig wenn der Schlüssel ein str (und ein gültiger Variablenname) ist.

MFG HerrHagen
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nachdem dein Grundansatz ziemlich umständlich ist: Was spricht eigentlich gegen die Nutzung des Dicts statt normaler Namen? Oder andersrum: Welchen Vorteil hast du, wenn du deinen globalen Namespace mit Variablen "verschmutzt", die dann eventuell andere überschreiben.

Wenn das nicht geht, solltest du eventuell doch auf gettext umsteigen.
sprich der reader selbst war [fast] fertig und ich will nicht alles von Grund auf neu machen...
Nennt sich Refactoring und erleichtert dir in Zukunft das Leben ;)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das fällt spätestens bei eigenen Objekten auf die Nase, denn ``<__main__.An object 0x...>`` ist keine gültige Python-Syntax.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
tordmor
User
Beiträge: 100
Registriert: Donnerstag 20. November 2008, 10:29
Wohnort: Stuttgart

Vielleicht sowas hier:

Code: Alles auswählen

class lookup:
    def __init__(self, node):
        self.node = node
    def __getattr__(self, attr):
        n = self.findByName(self.node, attr)
        if n.nodeType = n.TEXT_NODE:
            return n.data
        else:
            return lookup(n)
    def findByName(self, name).
        # left as exercise :)
        pass
http://www.felix-benner.com
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Leonidas hat geschrieben:Das fällt spätestens bei eigenen Objekten auf die Nase, denn ``<__main__.An object 0x...>`` ist keine gültige Python-Syntax.
Nö, es wird ja nur der Schlüssel als str übergeben:

Code: Alles auswählen

>>> class test:
	def __init__(self, a):
		self.a = a

>>> dic = {"a":1, "b":2, "c":test(3)}
>>> for i in dic:
	exec("%s = dic[%s]" % (i, repr(i)))
	
>>> c
<__main__.test instance at 0x00BB5FA8>
>>> c.a
3
Das ganze geht nur schief wenn der Schlüssel kein gültiger Variablenname ist. Dann würde das ganze aber natürlich auch keinen Sinnn machen. (ließe sich dann leicht mit try, except SyntaxError abfangen)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hast recht, da habe ich nicht so genau geschaut.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
alexander255
User
Beiträge: 30
Registriert: Montag 28. April 2008, 13:05

Das ganze ließe sich auch so lösen:

Code: Alles auswählen

import msg
lang = msg.parse(name, [tools.path.abspath('lang', __name__)])
Oder so ähnlich lösen ;)

Alexander
alexander255
User
Beiträge: 30
Registriert: Montag 28. April 2008, 13:05

Ihr hattet recht mit elementtree.ElementTree ich habe schon ein mindestens die hälfte der XML-Geschichten implementiert...toll :)
Leonidas hat geschrieben:
  • die gettext-Integration in Python fühlt sich nicht an wie ein PHP-Designpattern
  • deine Lösung unterstützt keinerlei Plural. Weder einfachen Plural noch besondere Pluralarten, die einige Sprachen so haben
  • deine Lösung nutzt XML, was in dem Fall hauptsächlich überflüssig ist, keinen Vorteil bringt
  • deine Lösung nutzt DOM, was ebenso unnütz ist, insbesondere da es ElementTree in der Stdlib gibtlist
  • Meinst du mit PHP-Designpattern so etwas wie <? echo blog("feed_list") ?> ?
  • Stimmt...kein Plural, mach ich gleich (Kannst du mir einen besonderen Plural nennen?)
  • Ich bin gerade dabei eine ElementTree implementation zu schreiben...s.o.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

alexander255 hat geschrieben:
  • Meinst du mit PHP-Designpattern so etwas wie <? echo blog("feed_list") ?> ?
  • Stimmt...kein Plural, mach ich gleich (Kannst du mir einen besonderen Plural nennen?)
Mit Üblen Designpatterns meinte ich irgendwelche Hacks an locals, globals, irgendwelche seltsamen Stringoperationen nur um sich um sauberen Code herumzuschummeln.

Und besondereren Plural gibt es etwa bei Sprachen die mehr als eine Pluralform haben. Als Beispiel etwa Singular bei 1 Ding, Plural bei 2-4 Dingen und ab 5 Dingen eine andere Pluralform (dies wird, soweit ich das verstehe, von gettext unterstützt). Oder sie haben einen Dual, Trial und dann noch den Paukal. Oder Sprachen die beim Plural unterscheiden ob der Sprecher sich mit aufnimmt in den Plural oder sich davon ausnimmt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten