Does anyone know if attrs handles this? I don't have a recent version installed, but I'll take a look later today.

Eric

On 9/24/2020 11:59 AM, Guido van Rossum wrote:
Interesting problem. Since the solution is just updating `__abstractmethods__`, this could be done in the `@dataclass` decorator, no new ABC needed.

On Thu, Sep 24, 2020 at 8:32 AM Ben Avrahami <avrahami....@gmail.com <mailto:avrahami....@gmail.com>> wrote:

    Hey all, I recently ran into some trouble and that I think
    deserves some attention. Consider the following case:

        class A(ABC):
            @abstractmethod
            def __lt__(self, other):
                pass

        @dataclass(order=True)
        class B(A):
            x: int = 0

        class C(B):
            pass

    Although B technically implements A's abstract methods, it is
    still considered an abstract class, and calling B() will fail.
    However, C is considered a non-abstract class and calling C() will
    succeed. This is because a class's "abstraction" is decided when a
    class is created. When B is created it does not implement __lt__,
    the implementation is added after creation by the
    dataclass decorator. Since C inherits from B after having its
    __lt__ set, C is considered non-abstract. This will also affect
    any "mixin-decorator" such as total_ordering, and also (a
    less-preferred use case) implementing abstract methods after class
    creation.

    There are many solutions for this, my proposed solution is for
    abc.ABCMeta to implement a __setattr__, that erases unimplemented
    metaclasses f they are implemented after class creation, Something
    along these lines:
        class ABCMeta2(ABCMeta):
            def __setattr__(self, key, value):
                super().__setattr__(key, value)
                if key != '__abstractmethods__' and value is not None:
                    self.__abstractmethods__ -= {key}

    Obviously some additional logic is needed to handle sub-classes
    and such, but I think it's a good starting point.

    Any thoughts?
    _______________________________________________
    Python-ideas mailing list -- python-ideas@python.org
    <mailto:python-ideas@python.org>
    To unsubscribe send an email to python-ideas-le...@python.org
    <mailto:python-ideas-le...@python.org>
    https://mail.python.org/mailman3/lists/python-ideas.python.org/
    Message archived at
    
https://mail.python.org/archives/list/python-ideas@python.org/message/6BNJ3YSEBPHEPGXSAZGBW3TJ64ZGZIHE/
    Code of Conduct: http://python.org/psf/codeofconduct/



--
--Guido van Rossum (python.org/~guido <http://python.org/~guido>)
/Pronouns: he/him //(why is my pronoun here?)/ <http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/>
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/NXBU2PFGIBWKPIFQ4TLIVQYVBU3AB4LS/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to