Was bedeutet left |= right?

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
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Guten morgen,

bin gestern auf dieses recipe gestoßen und verstehe innerhalb der `__init__` die Zuweisung

Code: Alles auswählen

...
        self |= []
nicht. Was passiert da?

Konnte auch in der Python Dokumentation nichts finden (was nicht unbedingt etwas zu bedeuten hat... ;-) ).

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Na ``self`` ist eine Menge:

Code: Alles auswählen

In [1]: set([0,3,4]) | set([1,2])
Out[1]: set([0, 1, 2, 3, 4])
den Rest solltest du dir denken koennen ;)
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

In die Richtung dachte ich ja auch, allerdings verstehe ich dann nicht, weshalb

Code: Alles auswählen

>>> s = set()
>>> s |= []
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for |=: 'set' and 'list'
nicht funktioniert.
Also eigentlich verstehe ich schon nicht, was `Bitwise inclusive OR` bzw. `Bitwise exclusive OR` wirklich bedeuten soll... :?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@mutetella: Was die Bitverknüpfungen bedeuten kann man im Internet nachlesen, das hat hiermit aber auch überhaupt nichts zu tun. Hier geht es um Mengen. Was „oder” in der Mengenlehre bedeutet, habe ich mal vor laaanger Zeit in der Grundschule gelernt. :-)

`set` funktioniert nicht — weil das eben nicht funktioniert. Das hätte gerne ein anderes `set` als zweiten Operanden. Im Rezept wird aber auch kein `set` verwendet, sondern eine Ableitung der abstrakten Klasse `collections.MutableSet`.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

BlackJack hat geschrieben:Was „oder” in der Mengenlehre bedeutet, habe ich mal vor laaanger Zeit in der Grundschule gelernt. :-)
:shock: Ernsthaft? Ich hatte Mengenoperationen in der 11. oder 12. Klasse. Also dir hat man in der 4. Klasse beigebracht, was Vereinigung, Schnitt etc. bedeuten und wie man diese Operationen anwendet?
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Das das logische ODER in __init__ da so einfach auf "nicht-Settypen" funktioniert, ist schon ein bisschen magisch. Zumal die Doku zu MutableSet sagt:
Inherited Set methods and clear, pop, remove, __ior__, __iand__, __ixor__, and __isub__
Aber gerade das __ior__ von Set erwartet rechts ein weiteres Set, die Prüfung findet aber für die ABC nicht mehr statt, sondern es wird für alle Elemente die abstrakte add-Methode bemüht. Offensichtlich ähnlich diesem Vorgehen:

Code: Alles auswählen

>>> class MySet(set):
...   def __init__(self, iterable):
...     if iterable is not None:
...       self |= iterable
...   def __ior__(self, other):
...     for el in other:
...       self.add(el)
... 
>>> ms = MySet('abcdeba')
>>> ms
MySet(['a', 'c', 'b', 'e', 'd'])
Sollte die Doku da ausführlicher sein?
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Ok, vielen Dank für die Antworten. Jetzt kapiert's auch ein einfacher Kaufmann wie ich... :mrgreen:

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten