Code soll intern Instanznamen generieren.

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
Thuught
User
Beiträge: 28
Registriert: Mittwoch 3. Dezember 2008, 12:19

Sonntag 7. Dezember 2008, 13:00

Hallo Python Forum,
Mein Programm soll eine Menge strings mit vielen Zusatzinformationen
verarbeiten. Die strings speichere ich in Instanzen(und die in eine Liste), wobei die Funktion sich die Instanznamen selbst generiert.
Ich habe bisher eine Variante mit Vars genommen. Wobei ich nichtmal weiß, was dieses vars genau macht. Gibt es bessere Methoden für sowas:
(dazu kommt noch, dass mir die Funktion ständig nen Syntaxerror wirft)

Code: Alles auswählen

class Vergeben: 
    Vindex=[]

class myinst():
    InstNr=0
    def __init__(self,tag):
        if tag in Vergeben.Vindex: raise Vergeben
        self.adr=string
        (Vergeben.Vindex).append(tag)

def makemyinst(tag):
	try:
		myinst.InstNr+=1
		egal="li"+str(myinst.InstNr)
		return vars()[egal]=link(tag)
	except Vergeben: pass
edit: dazu kommt noch, dass mir die Zeile:

Code: Alles auswählen

except Vergeben: pass
nen None zurückgibt. Stört weniger, aber vllt kann jmd von euch darauf auch nochmal eingehn.
Für Lösungsvorschläge wär ich Euch sehr dankbar
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Sonntag 7. Dezember 2008, 13:30

Wozu brauchst Du denn Instanznamen? Du hast doch Zugriff auf die Instanzen über einen Index für die Liste.
MfG
HWK
Thuught
User
Beiträge: 28
Registriert: Mittwoch 3. Dezember 2008, 12:19

Sonntag 7. Dezember 2008, 13:48

Ganz genau.
:oops: du hast recht. Hätt ich nicht gendacht, dass das so einfach geht.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Sonntag 7. Dezember 2008, 13:53

Und fürs Protokoll: Das Dict, das `vars()` zurückgibt, sollte man nicht verändern und es ist ein Implementationsdetail, was da dann letzlich passiert, nicht aber definiertes Verhalten.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Thuught
User
Beiträge: 28
Registriert: Mittwoch 3. Dezember 2008, 12:19

Sonntag 7. Dezember 2008, 14:02

Ja, ich hätt mir das Dict lieber anschauen sollen, alsdass ich es benutze. Dann würd ich auch Python mehr verstehen, bevor ich einfach loscode.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Sonntag 7. Dezember 2008, 17:05

Öhm...

Also erstmal solltest du dein Wissen über Objektorientierung fundieren. "Vergeben" ist kein Objekt. Man nutzt Klassen nicht als puren Namensraum (dafür gibts Module).

Was soll dann der Unsinn mit dem try / except? Was soll denn da überhaupt abgefangen werden? Das funktioniert sowieso nicht, da Exceptions von BaseException oder Exception erben müssen (das ist hier überhaupt nicht angebracht). Versucht du da Goto nachzubauen oder wie?

Als nächstes braucht man in Python nicht mit Namen hantieren (außer in Deserialisierungsfällen vielleicht), man kann direkt auf solche Dinge zugreifen.

Für den Rest verweise ich auf $Tutorial.
Thuught
User
Beiträge: 28
Registriert: Mittwoch 3. Dezember 2008, 12:19

Sonntag 7. Dezember 2008, 18:16

@str1442
Danke dir erstmal:
str1442 hat geschrieben: "Vergeben" ist kein Objekt. Man nutzt Klassen nicht als puren Namensraum (dafür gibts Module).
Was für Module meinst du? Ich kenn bisher nur re und urllib2.
Bin noch ziemlich neu in Python

Die Klasse "Vergeben" funktioniert bei mir als Exception. Im Moment prüf ich nur, ob vergeben. Mehr brauch ich erstmal nicht. Da ich nicht weiß, was BaseException so kann und macht(wie gesagt, bin noch ziemlich frisch), erb ich da erstmal nix von
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Sonntag 7. Dezember 2008, 18:56

Du kannst selber Module erstellen, genauer ist jede Python Datei und jedes Package (Ordner mit __init__.py Datei) ein Modul (Man kann sie sogar im Programm "on the fly" erstellen, aber bisher kenne ich keinen Fall, indem eine solch aggressive Namensraumeröffnung per Modul wirklich tragbar und praktisch wäre - aber das nur Nebenbei).
Die Klasse "Vergeben" funktioniert bei mir als Exception.
Und genau dafür sollte man Exceptions nicht einsetzen. Exceptions haben einen Sonderstatus und sollte nur bemüht werden, wenn es wirklich um (wie der Name ja sagt) Ausnahmen geht, mit denen man so nicht gerechnet hat oder die separat von der eigentlichen Logik benutzt werden, um eben auf Ausnahmesituationen zu reagieren. Sie sind nur für Dinge gedacht, die nicht direkt mit der Programmlogik zu tun haben sondern mit "extremeren" Problemen.

Das Problem an Exceptions ist, das sie eine Art "goto" darstellen. Das ist ein Konstrukt aus den ersten (imperativen) Sprachen, um an eine bestimmte Stelle im Quelltext zu "springen". Goto sollte man nicht verwenden, da es zu "Spaghetti Code" führt, und irgendwann schwer zu verstehen ist. Bei Exceptions macht sowas durchaus Sinn, sofern man es nicht extensiv betreibt. Aber sobald man es in der eigentlichen Logik benutzt, benutzt man "goto" nur auf umständliche Art und Weise.

BaseException ist die Grundklasse für alle Exceptions. Für die eigene Definition von Exceptions sollte man aber die Klasse Exception benutzen, die nicht ganz so "low level" ist. Ich dachte, man könne nicht eigene Klassen als Exception benutzen, die nicht von BaseException oder Exception erben, was aber nicht stimmt - ich hatte beim Test eine Klasse, die von object erbt, diese kann man nicht "raisen".

Übringens wird das mit Python 3.0 sowieso nicht mehr gehen, sollte man am Exception Modell nichts geändert haben. In Python 3.0 gibt es nur noch New Style Klassen, man muss also zwingend von einer Klasse erben, die von object erbt, oder selbst von object erben (wird das eigentlich dann automatisch gemacht? Oder bekomme ich dann einen SyntaxError bei "class Xyz: pass"?).

Das war jetzt aber für einen Anfänger alles etwas viel, was machst du da eigentlich? Sind das Aufgaben, die du abarbeitest? Dann könnte man sowas natürlich machen, rein des Lernens wegen. Wenn du aber versuchsts, irgendwas Richtiges mit solchem Code zu schreiben, dann kann ich nur raten, es erstmal zu lassen, und das Python.org Tutorial ausführlich durchzuarbeiten.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 7. Dezember 2008, 20:17

In Python 3.0 gibt es nur noch New Style Klassen, man muss also zwingend von einer Klasse erben, die von object erbt, oder selbst von object erben (wird das eigentlich dann automatisch gemacht? Oder bekomme ich dann einen SyntaxError bei "class Xyz: pass"?).
Natürlich kannst du in Python 3 die Klasse so definieren, alles andere wäre sinnlos. ``object`` ist ja eben nur da gewesen um die New-Style-Eigenschaften irgendwie in eine Klasse einzuführen; das hätte auch auf eine andere Weise gelöst werden können. In Python 3 gibt es nun keine Old-Style-Klassen und daher ist es nicht nötig explizit von ``object`` zu erben: das passiert nun implizit. Und ja, in Python 3 müssen Exceptions von ``BaseException`` erben.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten