Consider this fairly typical Python class:
class Publisher(object):
def __init__(self):
self._subscribers = []
def publish(self, event):
for subscriber in self._subscribers:
subscriber.published(event)
def subscribe(self, subscriber):
self._subscribers.append(subscriber)
If a user of this class has a bug where they accidentally pass something that isn't a Subscriber
to subscribe
, it fails slow. You don't find out that you screwed up until the next call to publish
, and by that point, it's likely too late to figure out who, exactly, screwed up.
The only way to deal with this is to insert tedious isinstance
checks everywhere, raise your own TypeErrors
with your own error messages, and so on. The result: nobody ever bothers.
I want to be able to do, instead, something like this:
self._subscribers = list[Subscriber]()
Then I could get a nice TypeError
at subscribe
time instead of publish
time.
It would also be great if I could do:
self._subscribers = dict[str:Subscriber]()