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

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
sashn
User
Beiträge: 2
Registriert: Montag 31. Mai 2010, 13:27

Montag 31. Mai 2010, 13:39

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
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Montag 31. Mai 2010, 13:54

Es gibt Dictionaries.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Montag 31. Mai 2010, 14:05

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.
sashn
User
Beiträge: 2
Registriert: Montag 31. Mai 2010, 13:27

Montag 31. Mai 2010, 20:45

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?
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Montag 31. Mai 2010, 20:53

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.
BlackJack

Montag 31. Mai 2010, 21:06

@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.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mittwoch 2. Juni 2010, 08:50

`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
Antworten