Hm, having a public API to do that would be nice. It seems there are two
implementations, one in Python, one in C. Maybe it's time you opened a bpo
issue and started working on a PR? This just seems too reasonable to keep
bugging python-ideas...

On Thu, Oct 1, 2020 at 7:55 AM Ben Avrahami <avrahami....@gmail.com> wrote:

> In theory, all that's necessary is to just run `_py_abc`'s abstract method
> population again (`ABCMeta.__new__`, with slight adjustments):
>
>     def update_abstractmethods(cls):
>         if not isinstance(cls, ABCMeta):
>             return cls
>         abstracts = set()
>         # include only abstract methods that are not implemented
>         for name in cls.__abstractmethods__:
>             value = getattr(cls, name, None)
>             if getattr(value, "__isabstractmethod__", False):
>                 abstracts.add(name)
>         # check for new abstract methods
>         # note that for most cases this loop is useless and can be
> scrapped for a minimal solution
>         for name, value in cls.__dict__.items():
>             if name not in abstracts \
>                     and getattr(value, "__isabstractmethod__", False):
>                 abstracts.add(name)
>         cls.__abstractmethods__ = frozenset(abstracts)
>         return cls
>
> My preferred API will be to just add this function into `abc`, but the
> minimal solution is to just airdrop this behaviour into `dataclass` (and
> possibly `total_ordering`), and let 3rd parties implement this logic
> themselves.
>
> On Thu, Oct 1, 2020 at 5:08 PM Guido van Rossum <gu...@python.org> wrote:
>
>> That might work (though not for older Python versions). What kind of API
>> were you thinking of for adding and deleting abstract methods?
>>
>> On Thu, Oct 1, 2020 at 01:07 Ben Avrahami <avrahami....@gmail.com> wrote:
>>
>>>
>>>
>>> I suppose it's better than nothing, since right now libraries are
>>> (rightfully) afraid to modify it or rely on its behaviour. Although I
>>> expect this will lead to a lot of repeated code, that looks a lot like the
>>> `__abstractmethods__` population in `_py_abc`. I think it's preferable to
>>> ease abstract method re-population for 3rd (and 1st) party libraries, but
>>> the dev team probably knows better. If this is an accepted solution, I'd be
>>> happy to write a BPO and PR.
>>>
>>> On Wed, Sep 30, 2020 at 5:30 PM Guido van Rossum <gu...@python.org>
>>> wrote:
>>>
>>>> Would it help if ‘__abstractmethods__’ was documented, overruling
>>>> whatever the PEP says?
>>>>
>>>> On Wed, Sep 30, 2020 at 00:01 Ben Avrahami <avrahami....@gmail.com>
>>>> wrote:
>>>>
>>>>> I encountered this problem when I needed to implement a class that
>>>>> defined all 4 of the comparison operators, once with `dataclass` (for one
>>>>> implementation) and once with `total_order` (for another).Also, 3rd party
>>>>> libs are expected to fall down this rabbit hole, and unless they're
>>>>> expected to modify `__abstractmethods__` and perform abstract logic on
>>>>> their own- I don't see why the standard library should keep such
>>>>> computations unavailable.
>>>>>
>>>>> On Tue, Sep 29, 2020 at 6:41 PM Eric V. Smith <e...@trueblade.com>
>>>>> wrote:
>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> On 9/29/2020 10:49 AM, Ben Avrahami
>>>>>>
>>>>>> wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Tue, Sep 29, 2020 at 4:53
>>>>>>
>>>>>> PM Bar Harel <bzvi7...@gmail.com> wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>>
>>>>>>> I'd like to bring another insight to the
>>>>>>>
>>>>>>> table: According to the pep, "Dynamically
>>>>>>>
>>>>>>> adding abstract methods to a class, or attempting to
>>>>>>>
>>>>>>> modify the abstraction status of a method or class once
>>>>>>>
>>>>>>> it is created, are not supported."
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> The notice exists both in the pep and at the abc module's
>>>>>>>
>>>>>>> docs, and is exactly what this idea is all about.
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> My question is why? Was there an objection for
>>>>>>>
>>>>>>> implementing such a thing, or was it complex enough to
>>>>>>>
>>>>>>> postpone for the time being?
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> I think this is fine. The "abstract-ness" of a class is not
>>>>>>
>>>>>> supposed to change throughout its lifetime. The problem
>>>>>>
>>>>>> arises when decorators change the class before it's ever
>>>>>>
>>>>>> used, as that should still be considered its
>>>>>>
>>>>>> "initialization" as far as the user is concerned, so
>>>>>>
>>>>>> its "abstract-ness" should change accordingly.
>>>>>>
>>>>>>
>>>>>> I agree with Guido in that the cleanest solution is to
>>>>>>
>>>>>> change the decorators. Perhaps a module function to
>>>>>>
>>>>>> recalculate a class's __abstractmethods __, that mixin
>>>>>>
>>>>>> decorators can call prior to returning the class. I can't
>>>>>>
>>>>>> really think of standard library class decorators that would
>>>>>>
>>>>>> use this global function other than `dataclass` and
>>>>>>
>>>>>> `total_ordering`, but in this way, 3rd party decorators can
>>>>>>
>>>>>> easily support implementing abstract functions.
>>>>>>
>>>>>>
>>>>>> The one downside to this solution is that it can easily
>>>>>>
>>>>>> be abused by calling it in the middle of a class's lifetime.
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> I think I'd like to see dataclasses handle this directly, so as
>>>>>>
>>>>>> to keep it easy to use. But I can be argued with: it's not like a
>>>>>>
>>>>>> beginner would stumble over this issue.
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> Eric
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>>
>>>>>>
>>>>>> 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/EQQVNE4IVG5ZLWZHY3HCIATUY32PHWJG/
>>>>>>
>>>>>>
>>>>>> Code of Conduct: http://python.org/psf/codeofconduct/
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>> _______________________________________________
>>>>>
>>>>> 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/ASPJKUZ46MAD5FT6HOLIFSQDFZR7IFGY/
>>>>>
>>>>> Code of Conduct: http://python.org/psf/codeofconduct/
>>>>>
>>>>> --
>>>> --Guido (mobile)
>>>>
>>>>
>>>>
>>>
>>> --
>> --Guido (mobile)
>>
>

-- 
--Guido van Rossum (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/K4725I42N4H2SK7LKOBMYQJQCQWE37UW/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to