mirror of https://github.com/astral-sh/ruff
## Summary This fixes an edge case that @carljm and I missed when implementing https://github.com/astral-sh/ruff/pull/13800. Namely, if the left-hand operand is the _exact same type_ as the right-hand operand, the reflected dunder on the right-hand operand is never tried: ```pycon >>> class Foo: ... def __radd__(self, other): ... return 42 ... >>> Foo() + Foo() Traceback (most recent call last): File "<python-input-1>", line 1, in <module> Foo() + Foo() ~~~~~~^~~~~~~ TypeError: unsupported operand type(s) for +: 'Foo' and 'Foo' ``` This edge case _is_ covered in Brett's blog at https://snarky.ca/unravelling-binary-arithmetic-operations-in-python/, but I missed it amongst all the other subtleties of this algorithm. The motivations and history behind it were discussed in https://mail.python.org/archives/list/python-dev@python.org/thread/7NZUCODEAPQFMRFXYRMGJXDSIS3WJYIV/ ## Test Plan I added an mdtest for this cornercase. |
||
|---|---|---|
| .. | ||
| assignment | ||
| binary | ||
| call | ||
| comparison | ||
| conditional | ||
| declaration | ||
| exception | ||
| expression | ||
| import | ||
| literal | ||
| loops | ||
| narrow | ||
| scopes | ||
| shadowing | ||
| stubs | ||
| subscript | ||
| unary | ||
| attributes.md | ||
| generics.md | ||
| unpacking.md | ||