Guido van Rossum <gu...@python.org> added the comment:

I still like to have a helper that recalculates the abstractness status of a 
class after adding some new methods (or deleting some).

I would prefer the isinstance(cls, ABCMeta) check to be inside that helper, so 
that you could call it unconditionally after adding/deleting methods: 
abc.update_abstractmethods(cls).  (It doesn't really need a comment saying 
"Update abstract methods" either. :-)

In fact, its signature makes the helper feasible as a class decorator itself, 
so that users who are using a mixin class decorator that doesn't update 
abstractness can add it conveniently themselvs. E.g. suppose @total_ordering 
didn't make this call itself, then the user could write

@abc.update_abstractmethods
@functools.total_ordering
class MyClass(SomeAbstractBaseClass):
    def __lt__(self, other):
        whatever

But I think it would be nice if @total_ordering and @dataclass did include this 
call.

However, I don't see why @total_ordering needs to be changed to also override 
abstract methods *defined in the decorated class*.  If I write

@functools.total_ordering
class MyAbstractClass(abc.ABC):
    @abc.abstractmethod
    def __lt__(self, other):
        return NotImplemented

it's totally clear to me what @total_ordering should do -- it should define 
__le__, __gt__ and __ge__ in terms of __lt__, and leave __lt__ alone, for some 
subclass to implement.

With these two amendments, the changes to dataclasses.py and functools.py are 
limited to two lines (adding the call to abc.update_abstractmethod(cls)), plus 
an import change.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue41905>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to