Seite 1 von 1

Objekt anhand des Namens aufrufen (z.B. "getObject()"?)

Verfasst: Montag 31. Mai 2010, 13:39
von sashn
Hi,

ich suche seit zwei Tagen nach einem Weg, Objekte anhand ihres Namens aufzurufen.
Beispiel:

Code: Alles auswählen

a = 5

a
gibt mir den Wert 5 aus. Jetzt suche ich aber so etwas wie

Code: Alles auswählen

getObject('a')
Das soll mir dann ebenso den Wert ausgeben. Gedacht ist das für solche Situationen, wo ich den Namen des aufgerufenen Objekts erst zur Laufzeit erzeuge.
Mit 'getattr' krieg' ich das irgendwie nicht hin. Ich probier' die ganze Zeit im interaktiven Modus rum und weiß nicht, was 'getattr' da dann als erstes Argument nimmt.

Hoffe, jemand kann mir helfen.

mfg,
sashn

Re: Objekt anhand des Namens aufrufen (z.B. "getObject()"?)

Verfasst: Montag 31. Mai 2010, 13:54
von cofi
Es gibt Dictionaries.

Re: Objekt anhand des Namens aufrufen (z.B. "getObject()"?)

Verfasst: Montag 31. Mai 2010, 14:05
von Darii
Was cofi sagen will ist, dass du deine Objekte lieber in ein Dictionary packen solltest, statt zu versuchen, dynamisch Variablennamen zusammenzubasteln.

Wenn es gar nicht anders geht, findest du die Objekte in dem locals() oder globals()-Dictionary mit dem Variablennamen als Schlüssel.

Re: Objekt anhand des Namens aufrufen (z.B. "getObject()"?)

Verfasst: Montag 31. Mai 2010, 20:45
von sashn
Vielen Dank euch beiden für die Antworten.

Aus cofis kurzer und (nicht bös gemeint) 'schwammiger' Antwort schließe ich, dass meine Frage wieder irgendwie 'doof' oder 'unerwünscht' war? Ich sage "wieder", weil ich das halt schon aus diversen Fachforen kenne: Die Leute wollen nicht als einfache und schnelle Lösung für irgendjemandes 'banales Anfängerproblem' ausgenutzt werden. Aber wie gesagt, ich hatte mir, bevor ich hier gefragt hab, schon 'nen Ast gegooglet und recherchiert. Ich will jetzt hier keine Diskussion vom Zaun brechen, mich würde nur interessieren: War irgendetwas an meiner Frage nicht in Ordnung, sollte ich Fragen anders stellen, etc.?

Zu Darii: Deine Formulierung lässt vermuten, dass es sich bei der Benutzung von locals() etc. nicht um den 'Königsweg' handelt. Darf ich fragen, wieso?

Re: Objekt anhand des Namens aufrufen (z.B. "getObject()"?)

Verfasst: Montag 31. Mai 2010, 20:53
von cofi
Nein, ich habe nur nicht allzu viel Sinn darin gesehen dir noch mehr darueber zu erzaehlen, da das die Doku viel besser kann, aber das geht eben nur, wenn man die entsprechenden Hinweise hat.
Schau dir nur die Threads an es gibt jede menge Anfaengerthemen, und sie sind nun wirklich kein Problem. Ich wollte einfach nich mehr Zeit als noetig fuer uns beide verschwenden ;)

`locals()` und `globals()` sind auch nicht anderes als Dictionaries, aber eben die Dictionaries die in normalem Code verwende werden insofern macht es Sinn die moeglichst sauber zu halten, auch um unbeabsichtigte Kollisionen zu vermeiden.

Re: Objekt anhand des Namens aufrufen (z.B. "getObject()"?)

Verfasst: Montag 31. Mai 2010, 21:06
von BlackJack
@sashn: An der Frage wie sie gestellt wurde ist alles in Ordnung. Das Problem liegt in dem Wunsch "dynamische Namen" verwenden zu wollen. Warum will man so etwas machen? Man kann die nicht im Quelltext hinschreiben, weil man zu dem Zeitpunkt ja noch gar nicht weiss wie die heissen werden. Also warum sollten sie dann *in dem* Namensraum liegen und nicht sauber in einem eigenen Dictionary, wo sie zum Beispiel auch nicht mit bereits vorhandenen oder zukünftigen Namen im Quelltext kollidieren können.

Re: Objekt anhand des Namens aufrufen (z.B. "getObject()"?)

Verfasst: Mittwoch 2. Juni 2010, 08:50
von sma
`locals` (und `global`) ist allgemein keine gute Idee, da es die Interna von CPython aufdeckt (andere Python-Systeme unterstützen das unter Umständen gar nicht) und von der "normalen" Ebene der Programmierung auf die Meta-Ebene wechselt, was zu schwer verständlichem Code führen kann.

Stefan