7.12. Operator Contains

  • in - contains

  • y in x - will call "contains" on object x (x.__contains__(y))

7.12.1. Example

>>> class Group:
...     def __init__(self):
...         self.members = []
...
...     def __iadd__(self, user):
...         self.members.append(user)
...         return self
...
...     def __contains__(self, user):
...         return user in self.members
>>>
>>>
>>> admins = Group()
>>> admins += 'mwatney'
>>> admins += 'mlewis'
>>> admins += 'rmartinez'
>>>
>>> admins.members
['mwatney', 'mlewis', 'rmartinez']
>>>
>>> 'mwatney' in admins
True
>>>
>>> 'avogel' in admins
False

7.12.2. Implementation

>>> class Group:
...     def __init__(self):
...         self.members = []
...
...     def __iadd__(self, user):
...         self.members.append(user)
...         return self
...
...     def __contains__(self, user):
...         for member in self.members:
...             if member == user:
...                 return True
...         return False
>>>
>>>
>>> admins = Group()
>>> admins += 'mwatney'
>>> admins += 'mlewis'
>>> admins += 'rmartinez'
>>>
>>> admins.members
['mwatney', 'mlewis', 'rmartinez']
>>>
>>> 'mwatney' in admins
True
>>>
>>> 'avogel' in admins
False

7.12.3. Assignments

Code 7.28. Solution
"""
* Assignment: Operator Comparison Contains
* Complexity: easy
* Lines of code: 5 lines
* Time: 5 min

English:
    1. Override operators for code to work correctly
    2. Do not use `dataclasses`
    3. Run doctests - all must succeed

Polish:
    1. Nadpisz operatory aby poniższy kod zadziałał poprawnie
    2. Nie używaj `dataclasses`
    3. Uruchom doctesty - wszystkie muszą się powieść

Hints:
    * `object.__contains__()`
    * `object.__eq__()`

Tests:
    >>> import sys; sys.tracebacklimit = 0

    >>> mark = User(firstname='Mark', lastname='Watney', groups=[
    ...     Group(gid=1, name='admins'),
    ...     Group(gid=2, name='staff'),
    ...     Group(gid=3, name='managers'),
    ... ])

    >>> Group(gid=1, name='admins') == Group(gid=1, name='admins')
    True
    >>> Group(gid=1, name='admins') == Group(gid=2, name='staff')
    False
    >>> Group(gid=1, name='admins') == Group(gid=3, name='managers')
    False
    >>> Group(gid=1, name='admins') == Group(gid=0, name='root')
    False

    >>> Group(gid=1, name='admins') in mark
    True
    >>> Group(gid=2, name='staff') in mark
    True
    >>> Group(gid=0, name='root') in mark
    False
"""


class Group:
    gid: int
    name: str

    def __init__(self, gid: int, name: str) -> None:
        self.gid = gid
        self.name = name


class User:
    firstname: str
    lastname: str
    groups: list[Group]

    def __init__(self, firstname: str, lastname: str, groups: list) -> None:
        self.firstname = firstname
        self.lastname = lastname
        self.groups = groups