listen replace

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
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Kann es sein, das du vielleicht lieber ein set() anstatt eine Liste möchtest? Wenn die Ordnung der Liste nicht wichtig ist und du sie benutzt, um gleichartige Elemente festzuhalten, ist eine Menge oft angebrachter. Mengen besitzen eine discard() Funktion, die ein Element entfernt, wenn es schon vorhanden ist und ansonsten nichts tut. add() fügt ein Element nur dann hinzu wenn es nicht bereits vorhanden ist. Willst du also ein Element durch ein anderes ersetzen, welches sich mit einem anderen identifiziert, kannst du discard() und add() hintereinander aufrufen und deckst alle Fälle ab (angenommen, du willst Objekte auch hinzufügen, wenn sie noch nicht vorhanden sind). Mit Mengen und entsprechenden Objekten, die __hash__ und __eq__ / __neq__ implementieren kann man so recht nette Sachen machen.

Code: Alles auswählen

>>> my_set = set()
>>> class A(object):
...  def __init__(self, name):
...     self.name = name
...  def __str__(self):
...      return "Name: %s" % self.name
...  __repr__ = __str__ # Don't do this at home
...  def __hash__(self):
...     return 1
...  def __eq__(self, other):
...      return True
...  def __neq__(self, other):
...      return not self == other
... 
>>> my_set.add(A("First"))
>>> print my_set
set([Name: First])
>>> my_set.add(A("Second"))
>>> print my_set
set([Name: First])
>>> my_set.pop()
Name: First
>>> my_set
set([])
>>> my_set.add(A("Second"))
>>> my_set
set([Name: Second])
>>> my_set.discard(A("Third"))
>>> my_set
set([])
>>> my_set.add(A("Fourth"))
>>> my_set
set([Name: Fourth])
@cofi: Man kann Methoden zu jeder Klasse hinzufügen, die keine Builtin Klasse ist. list.replace = replace funktioniert also nicht.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

str1442 hat geschrieben:@cofi: Man kann Methoden zu jeder Klasse hinzufügen, die keine Builtin Klasse ist. list.replace = replace funktioniert also nicht.
Wenn ich mich richtig erinnere hat Trundle ein Stückchen Code geschrieben, dass auch das mittels ctypes hinbekommt. Ist natürlich ein fieser Hack, aber trotzdem irgendwie cool.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Ja, aber daß funktionierte doch nur, weil id() momentan die Speicheraddresse eines Objektes zurückliefert und man diese als Pointer benutzen kann? Insofern wäre es also nur möglich, bereits vorhandene Namen zu überschreiben, aber keine neuen anzulegen. Aber man kann damit schon nette Sachen machen :)
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Nein, man holt sich einfach das Dict mit `ctypes.pythonapi._PyObject_GetDictPtr()` und verändert das. Dazu braucht man keine Adresse, sondern nur ein Py-Objekt und man kann auch Sachen hinzufügen.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Antworten