Даже на таком простом уровне, как реализация типа-суммы (дизъюнктное объединение типов- параметров).
class Sum(Generic[T, U]):
def __init__(self, value: Union[T, U], is_left: Optional[bool] = None):
Когда уже сделал реализацию, но решил сэкономить на том, чему активно учишь других, и забил на TDD (или хотя бы "тесты-первыми"). В результате первые же тесты ломаются, после чего тратишь кучу времени на странные баги, а когда добираешься до причины, понимаешь, что всё придётся переписать заново :)
Я совсем забыл, что питончик - это type erasure, когда информация о параметрах типа (T и U для класса Sum[T, U]) стирается во время выполнения...
Тут рекомендуют паттерн Стратегия, но я бы для продакшена делал фабричные методы вроде Sum.left(), которые создают экземпляры Sum с явно заданным значением is_left, что полностью обходит необходимость определения типа во время выполнения.
Но в данном случае (и в ряде существенно более сложных) мне надо
