New submission from Dan Snider <mr.assume.a...@gmail.com>:
>>> class Dict(dict): def keys(self): assert 0 def update(*args, **kwds): assert 0 def __getitem__(self, key): assert 0 def __iter__(self): assert 0 >>> {**Dict(a=1)} {'a': 1} The opcode uses PyDict_Update, which calls the internal dict_merge function which contains the following line: if (PyDict_Check(b) && (Py_TYPE(b)->tp_iter == (getiterfunc)dict_iter)) Translated to Python, that should be equal to if type(b).__flags__ & (1<<29) and type.__getattribute__(type(b), '__iter__') is type.__getattribute__(dict, '__iter__')` Both that and the line in C evaluate to false for me (while a dict subclass that doesn't override __iter__ evaluates to true), so I apparently can't help narrow down the problem any further assuming people agree that this is even is a problem... The BUILD_MAP_UNPACK_WITH_CALL, CALL_FUNCTION_EX, and CALL_FUNCTION_KW opcodes are affected as well. ---------- components: Interpreter Core messages: 329280 nosy: bup priority: normal severity: normal status: open title: BUILD_MAP_UNPACK doesn't function as expected for dict subclasses type: behavior versions: Python 3.6, Python 3.7 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue35166> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com