gerade bei GUI oder auch XML-Programmierung kommt man öfter in die Verlegenheit, eindeutige IDs für Elemente zu erstellen. Ich hab mir dafür mal eine kleine Funktion geschrieben, die ich gerne an Euch weitergebe.
def generate_ID(name, fmt="%s_%03d", start=1):
""" Erzeuge ID-String mit "name" und fortlaufender Nummer im Format "fmt" """
id = getattr(generate_ID,name,start)
setattr(generate_ID, name, id+1)
return fmt % (name, id)
Hi. Ich weiß nicht ganz so... mir gefällt das nicht, dass man der Funktion Atribute verpasst, als wäre sie eine Klasse. Geht es denn nicht auch mit global eine Variable hochzuzählen? Da müsste dann zwar vielleicht der Name zusammen mit der ID in einem Tupel gespeichert werden, aber das kommt mir irgendwie sauberer vor...
Milan hat geschrieben: ...mir gefällt das nicht, dass man der Funktion Atribute verpasst, als wäre sie eine Klasse...
Das geht mir ähnlich, aber vielleicht bin ich es auch nur nicht gewöhnt.
Jedenfalls geht es IMO auch eleganter, da man ja mit Hilfe von __call__ beliebige Instanzen wie Funktionen aussehen lassen kann. Ich mache es immer so:
Hi. Die Version find ich wesentlich besser . Sicher haben globale Variablen so ihre Risiken, weil man nie weiß, wie der Nutzer damit umgeht. Dessen bin ich mir bewusst, was dabei passieren kann. Aber das hier ist der Königsweg... mutable Objects haben schon ihre Vorteile
def id_generate(name, fmt="%s_%03d", _dict={}):
id = _dict.get(name,0)+1
_dict[name] = id
return fmt % (name, id)
Ich habe nur eine kurze Frage:
Warum wird der letzte Eintrag von "_dict" nicht durch den erneuten Aufruf der Funktion gelöscht, da beim Aufruf doch "_dict={}" gesetzt wird?
_dict wird auf ein leeres Dictionary ({}) gesetzt, wenn der Interpreter das Funktionsobjekt erzeugt. Also wenn die def Anweisung ausgeführt wird.
In der Funktion wird dem Dictionary ein neues Schlüssel-Werte-Paar hinzugefügt oder modifiziert, es ist immer noch das gleiche Dictionary, welches bei der Erzeugung des Funktionsobjekts angelegt wurde.
Ich verstehe immer noch nicht wie Python sich das merkt.
Wenn ich folgenden Code ausführe, rufe ich die Funktion doch immer wieder neu auf. Das "_dict" müßte doch dann immer wieder auf "{}" gesetzt werden?
Die vordefinierten Parameter sind wie Zettelchen, auf denen Steht die Adresse eines Objekts. Wenn der Interpreder den Code nach dem def statement, der den Funktionscode abarbeitet wird für jeden Parameter der schon einen Wert zugeweisen bekommen hat ein entsprechendes Objekt angelegt. Wenn dieser Parameter ein Mutable Objekt ist (Dictionary oder Liste), so kann dieses Objekt verändert werden.
Nobuddy hat geschrieben:Danke für Deinen id_generator, funktioniert prima!
Mit diesem Posting hast du vermutlich den Rekord gebrochen und bist dadurch dem Verderben anheim gefallen. Dermaßen alte Threads darf definitiv nur der offizielle Zombiemeister dieses Forums wiederbeleben. Die Konsequenzen für dich werden furchtb ... nein, ich sage jetzt nichts dazu ...