On Wed, Jul 14, 2021 at 10:17 AM Patrick Reader <python-...@pxeger.com> wrote:
> Hi there, > > I've noticed that, when a frame's __builtins__ is a subclass of dict with > an overridden __getitem__ method, this overriden method is not used by the > IMPORT_NAME instruction to lookup __import__ in the dictionary; it uses the > lookup function of normal dictionaries (via _PyDict_GetItemIdWithError). > This is contrary to the behaviour of the similar LOAD_BUILD_CLASS, as well > as the typical name lookup semantics of LOAD_GLOBAL/LOAD_NAME, which all > use PyDict_CheckExact for a "fast path" before defaulting to > PyObject_GetItem, which is unexpected. > > Perhaps more seriously, if __builtins__ is not a dict at all, then it gets > erroneously passed to some internal dict functions resulting in a > mysterious SystemError ("Objects/dictobject.c:1440: bad argument to > internal function") which, to me, indicates fragile behaviour that isn't > supposed to happen. > > I'm not sure if this intended, so I didn't want to open an issue yet. It > also seems a highly specific use case and changing it would probably cause > a bit of a slow-down in module importing so is perhaps not worth fixing. I > just wanted to ask here in case this issue had been documented anywhere > before, and to check if it might actually be supposed to happen before > opening a bug report. > At this point it's basically a feature request since it's been like that for so long. > I cannot find evidence that this behaviour has changed at all in recent > history and it seems to be the same on the main branch as in 3.9.6. > I believe it's been like that for as long as I have worked on importlib which is over a decade. The lookup also skips over any global definition of __import__ and goes straight to __builtins__. > A short demo of these things is attached. > > Links to relevant CPython code in v3.9.6: > > IMPORT_NAME: > https://github.com/python/cpython/blob/v3.9.6/Python/ceval.c#L5179 > > BUILD_CLASS: > https://github.com/python/cpython/blob/v3.9.6/Python/ceval.c#L2316 > > LOAD_NAME: > https://github.com/python/cpython/blob/v3.9.6/Python/ceval.c#L2488 > > LOAD_GLOBAL: > https://github.com/python/cpython/blob/v3.9.6/Python/ceval.c#L2546 > > Thanks, > > Patrick Reader > _______________________________________________ > 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/ZQMF6XC76J4APJPB3X6PGATG6CV5NN44/ > 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/LFF7RUZPYWPKQWB243IQLBIUEI3UKIK3/ Code of Conduct: http://python.org/psf/codeofconduct/