Good catch, Eric. For those who wonder what the difference is or why it matters, it's what we do for all dunder operators: the magic method is looked up on the class, not on the instance. This means you can't e.g. override + on a per-instance basis by having an instance variable named '__add__' pointing to some function. That's a rare use case, it's pretty obfuscated, it would slow down everything, and if you really need that pattern, there are other ways to do it (you could have a regular instance method __add__ on the class that looks for an instance variable, e.g. named _add, and call it if it exists -- otherwise call super().__add__).
--Guido On Sat, Sep 19, 2015 at 4:03 AM, Eric V. Smith <e...@trueblade.com> wrote: > While finishing up the implementation of PEP 498, I realized that the > PEP has an error. It says that this code: > > f'abc{expr1:spec1}{expr2!r:spec2}def{expr3:!s}ghi' > > Is equivalent to: > > 'abc' + expr1.__format__(spec1) + repr(expr2).__format__(spec2) + 'def' > + str(expr3).__format__('') + 'ghi' > > But that's not correct. The right way to call __format__ is: > > type(expr1).__format__(expr1, spec1) > > That is, the lookup of __format__ is done on the type, not the instance. > > Instead of calling __format__, I've changed the code generator to call > format(expr1, spec1). As an optimization, I might add special opcodes to > deal with this and string concatenation, but that's for another day (if > ever). > > I've posted a new version of the code in issue 24965. I'll update the > PEP itself sometime this weekend. > > _______________________________________________ > Python-Dev mailing list > Python-Dev@python.org > https://mail.python.org/mailman/listinfo/python-dev > Unsubscribe: > https://mail.python.org/mailman/options/python-dev/guido%40python.org > -- --Guido van Rossum (python.org/~guido)
_______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com