и посмотреть медиа
Код на салфетке - Python кодинг
и посмотреть медиа
Канал о программировании на Python и других языках. Простые объяснения и коды.
Канал о программировании на Python и других языках. Простые объяснения и коды.
AI бот для озвучки текста и клонирования голоса в Telegram. Создавай аудио с помощью нейросети быстро и просто.
Ресурс для интересующихся программированием. Фокус на Python, но охватывает и другие темы. Простые примеры и разборы.
Знаете ли вы, что a + b и b + a в Python могут вернуть разное? Сложение выглядит симметрично, но под капотом Python сначала вызовет type(a).__add__(a, b). Левый и правый операнды идут через разные методы – __add__ и __radd__. Если у __add__ левого типа нет реализации для типа правого – он вернет NotImplemented, и Python вызовет __radd__ правого. class Money: def __init__(self, n): self.n = n def __radd__(self, other): return Money(self.n + other) result = 10 + Money(5) print(result.n) # 15 int.__add__(10, Money(5)) возвращает NotImplemented – тип int ничего не знает о Money. Тогда Python вызывает Money.__radd__(Money(5), 10) – и он-то знает что делать с int. Важно: NotImplemented это значение-синглтон, не исключение NotImplementedError. Возврат NotImplemented – сигнал для того чтобы попробовать другой метод, а не ошибка. Бывает исключение из обычного порядка: если правый операнд – подкласс левого и определяет свой __radd__, он вызывается первым, до __add__ левого: class A: def __add__(self, other): return "A.__add__" class B(A): def __radd__(self, other): return "B.__radd__" print(A() + B()) # B.__radd__ – а не A.__add__ Это сделано чтобы подкласс мог переопределить поведение базового класса. Если бы порядок был как обычно, то A.__add__ отработал бы первым и B никогда бы не получил шанс вмешаться, даже специально определив __radd__. Если оба метода возвращают NotImplemented (или их вообще нет) – случится TypeError: class X: pass class Y: pass try: X() + Y() except TypeError as e: print(e) # unsupported operand type(s) for +: 'X' and 'Y' Именно это сообщение Python выдает когда исчерпаны все варианты диспетчеризации. + может попробовать сделать сложение в два захода. Сначала через левый объект. И если через левый не получилось – то через правый. NotImplemented здесь – способ сказать "передай дальше", а не ошибка. Те же правила распространяются на __rsub__, __rmul__, __rtruediv__ и остальные reflected-методы. В следующий вторник – / vs // и отрицательное деление: почему -7 // 2 == -4, а не -3. Код на салфетке x Кусочки кода
Открыть канал и посмотреть медиаТолько зарегистрированные пользователи могут делиться своим мнением.
Станьте первым, кто поделится своим впечатлением об этом ресурсе!