Use collections.abc when code should accept objects by their supported interface rather than by a fixed list of concrete classes. Its abstract base classes provide generic runtime checks for container and iterable-like behavior. section 10.1.3
Accept any collection of urgencies
from collections.abc import Collection def filter_tasks(tasks, by_urgency): if isinstance(by_urgency, Collection): filtered = [x for x in tasks if x.urgency in by_urgency] else: filtered = [x for x in tasks if x.urgency == by_urgency] return filtered Collection requires __contains__, __iter__, and __len__, so the function can handle list, tuple, set, Series, and custom collection classes without naming each type. section 10.1.3
Listing 10.4 Checking an object’s type against an abstract class
from collections.abc import Collection
def filter_tasks(tasks, by_urgency):
if isinstance(by_urgency, Collection):
filtered = [x for x in tasks if x.urgency in by_urgency]
else:
filtered = [x for x in tasks if x.urgency == by_urgency]
return filtered
Inspect the focused filter_tasks implementation using Collection with isinstance. section 10.1.3
