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

Reply via email to