Raymond Hettinger <raymond.hettin...@gmail.com> added the comment:

Guido, can the method update be made automatic?  When instantiation fails, 
recheck to see the missing abstract methods had been defined?

    >>> from abc import *
    >>> class P(ABC):
            @abstractmethod
            def m(self):
                    pass
            
    >>> class C(P):
            pass

    >>> C.m = lambda self: None
    >>> C()
    Traceback (most recent call last):
      File "<pyshell#11>", line 1, in <module>
        C()
    TypeError: Can't instantiate abstract class C with abstract method m

The latter message doesn't make sense that it should occur at all.

Roughly, the existing instantiation logic is:

     if cls.__abstractmethods__:
         raise TypeError(f"TypeError: Can't instantiate abstract class
                         {cls.__name} with abstract method {methname}")

Could that be changed to something like this:

     if cls.__abstractmethods__:
         for methname is cls.__abstractmethods__.copy():
             if getattr(cls, methname).__isabstractmethod__:
                 raise TypeError(f"TypeError: Can't instantiate abstract class
                                  {cls.__name} with abstract method {methname}")
             cls.__abstractmethods__.remove(methname)

I haven't thought this through.  Was just thinking that it would nice to have 
automatic updates rather than transferring the responsibility outside of the 
core ABC logic.

----------

_______________________________________
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