|
| 1 | +# tag::DOCTESTS[] |
| 2 | +""" |
| 3 | +``HackerClubMember`` objects accept an optional ``handle`` argument:: |
| 4 | +
|
| 5 | + >>> anna = HackerClubMember('Anna Ravenscroft', handle='AnnaRaven') |
| 6 | + >>> anna |
| 7 | + HackerClubMember(name='Anna Ravenscroft', guests=[], handle='AnnaRaven') |
| 8 | +
|
| 9 | +If ``handle`` is ommitted, it's set to the first part of the member's name:: |
| 10 | +
|
| 11 | + >>> leo = HackerClubMember('Leo Rochael') |
| 12 | + >>> leo |
| 13 | + HackerClubMember(name='Leo Rochael', guests=[], handle='Leo') |
| 14 | +
|
| 15 | +Members must have a unique handle. The following ``leo2`` will not be created, |
| 16 | +because its ``handle`` would be 'Leo', which was taken by ``leo``:: |
| 17 | +
|
| 18 | + >>> leo2 = HackerClubMember('Leo DaVinci') |
| 19 | + Traceback (most recent call last): |
| 20 | + ... |
| 21 | + ValueError: handle 'Leo' already exists. |
| 22 | +
|
| 23 | +To fix, ``leo2`` must be created with an explicit ``handle``:: |
| 24 | +
|
| 25 | + >>> leo2 = HackerClubMember('Leo DaVinci', handle='Neo') |
| 26 | + >>> leo2 |
| 27 | + HackerClubMember(name='Leo DaVinci', guests=[], handle='Neo') |
| 28 | +""" |
| 29 | +# end::DOCTESTS[] |
| 30 | + |
| 31 | +# tag::HACKERCLUB[] |
| 32 | +from dataclasses import dataclass |
| 33 | +from club import ClubMember |
| 34 | + |
| 35 | +@dataclass |
| 36 | +class HackerClubMember(ClubMember): # <1> |
| 37 | + |
| 38 | + all_handles = set() # <2> |
| 39 | + |
| 40 | + handle: str = '' # <3> |
| 41 | + |
| 42 | + def __post_init__(self): |
| 43 | + cls = self.__class__ # <4> |
| 44 | + if self.handle == '': # <5> |
| 45 | + self.handle = self.name.split()[0] |
| 46 | + if self.handle in cls.all_handles: # <6> |
| 47 | + msg = f'handle {self.handle!r} already exists.' |
| 48 | + raise ValueError(msg) |
| 49 | + cls.all_handles.add(self.handle) # <7> |
| 50 | +# end::HACKERCLUB[] |
0 commit comments