On 01/02/2021 19:06, Guido van Rossum wrote:
That code is quite old. This comment tries to explain it:
```
/* Check that the use doesn't do something silly and unsafe like
object.__new__(dict). To do this, we check that the
most derived base that's not a heap type is this type. */
```
I understand what it is checking, but I don't understand why it is
"silly and unsafe".
I think you may have to special-case this and arrange for B.__new__()
to be
called, like it or not.
But it's already been called. The check fails when trying to
subsequently call object.__new__().
(If you want us to change the code, please file a bpo bug report. I
know
that's no fun, but it's the way to get the right people involved.)
Happy to do that but I first wanted to check if I was doing something
"silly" - I'm still not sure.
Phil
On Mon, Feb 1, 2021 at 3:27 AM Phil Thompson via Python-Dev <
python-dev@python.org> wrote:
Hi,
I'm trying to understand the purpose of the check in tp_new_wrapper()
of
typeobject.c that results in the "is not safe" exception.
I have the following class hierarchy...
B -> A -> object
...where B and A are implemented in C. Class A has an implementation
of
tp_new which does a few context-specific checks before calling
PyBaseObject_Type.tp_new() directly to actually create the object.
This
works fine.
However I want to allow class B to be used with a Python mixin. A's
tp_new() then has to do something similar to super().__new__(). I have
tried to implement this by locating the type object after A in B's
MRO,
getting it's '__new__' attribute and calling it (using
PyObject_Call())
with B passed as the only argument. However I then get the "is not
safe"
exception, specifically...
TypeError: object.__new__(B) is not safe, use B.__new__()
I take the same approach for __init__() and that works fine.
If I comment out the check in tp_new_wrapper() then everything works
fine.
So, am I doing something unsafe? If so, what?
Or, is the check at fault in not allowing the case of a C extension
type
with its own tp_new?
Thanks,
Phil
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at
https://mail.python.org/archives/list/python-dev@python.org/message/HRGDEMURCJ5DSNEPMQPQR3R7VVDFA4ZX/
Code of Conduct: http://python.org/psf/codeofconduct/
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at
https://mail.python.org/archives/list/python-dev@python.org/message/ZNJK6BJLXCMOOZNEDGNZZKT2YG4XUV57/
Code of Conduct: http://python.org/psf/codeofconduct/