Issue32332
Created on 2017-12-15 06:47 by yselivanov, last changed 2022-04-11 14:58 by admin. This issue is now closed.
| Pull Requests | |||
|---|---|---|---|
| URL | Status | Linked | Edit |
| PR 4878 | closed | yselivanov, 2017-12-15 06:48 | |
| Messages (4) | |||
|---|---|---|---|
| msg308365 - (view) | Author: Yury Selivanov (yselivanov) * ![]() |
Date: 2017-12-15 06:47 | |
I propose to add type slots for magic methods introduced by PEP 560. In the brief discussion on the mailing list Guido OK'd the idea: https://mail.python.org/pipermail/python-dev/2017-December/151262.html I'll submit a PR that implements this proposal by adding new 'tp_as_class' slot, that points to a PyClassMethods struct, that has two fields: `cm_getitem` and `cm_mro_entries`. Interestingly, when __class_getitem__ is implemented through the type/slots machinery it becomes a bit faster. Given the following microbenchmark: class Foo: def __class_getitem__(cls, o): return o for _ in range(3): t = time.monotonic() for i in range(10 ** 8): assert i == Foo[i] print(f'{time.monotonic() - t:.3f}s') I see these numbers for the master branch: 17.161s 17.024s 16.530s and these for the C-slots branch: 15.010s 15.693s 15.035s |
|||
| msg308368 - (view) | Author: Serhiy Storchaka (serhiy.storchaka) * ![]() |
Date: 2017-12-15 07:51 | |
This isn't so easy. You can't just access new slot, because this is binary incompatible. You should add new type flag, say Py_TPFLAGS_HAVE_CLASS, set it for all classes with tp_as_class, and guard access to tp_as_class with
if (!PyType_HasFeature(tp, Py_TPFLAGS_HAVE_CLASS))
|
|||
| msg308397 - (view) | Author: Serhiy Storchaka (serhiy.storchaka) * ![]() |
Date: 2017-12-15 14:43 | |
PR 4883 shows how magic methods for PEP 560 can be implemented without introducing new slots. |
|||
| msg308399 - (view) | Author: Yury Selivanov (yselivanov) * ![]() |
Date: 2017-12-15 14:56 | |
Serhiy, I've tested METH_STATIC approach and it works just fine. Thanks for pointing that out! I agree that adding slots for something that's already possible is an overkill, so let's close this issue. |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022-04-11 14:58:55 | admin | set | github: 76513 |
| 2017-12-15 14:56:42 | yselivanov | set | status: open -> closed type: enhancement messages: + msg308399 resolution: rejected |
| 2017-12-15 14:43:15 | serhiy.storchaka | set | messages: + msg308397 |
| 2017-12-15 07:51:15 | serhiy.storchaka | set | nosy:
+ serhiy.storchaka messages: + msg308368 |
| 2017-12-15 06:48:54 | yselivanov | set | keywords:
+ patch stage: patch review pull_requests: + pull_request4772 |
| 2017-12-15 06:47:42 | yselivanov | create | |
