New submission from Sam De Meyer: According to the docs (https://docs.python.org/3/c-api/object.html) the `PyObject_GetIter` method should be equivalent to the python call `iter(<some_dict>)`, but, when given a dict, the `PyObject_GetIter` returns an iterator over key-value pairs whereas the `iter()` method returns an iterator over keys only.
I tripped over this when giving the `<some_dict>.update()` a dict-like object that does not inherit from the builtin dict and implements its own `__iter__()`. The `update()` method eventually reaches the following piece of code: https://hg.python.org/cpython/file/4243df51fe43/Objects/dictobject.c#l2383 > it = PyObject_GetIter(seq2); > ... > item = PyIter_Next(it); > ... > fast = PySequence_Fast(item, ""); > ... > key = PySequence_Fast_GET_ITEM(fast, 0); > value = PySequence_Fast_GET_ITEM(fast, 1); displaying the difference in behaviour between `PyObject_GetIter` and `iter(o)`. ---------- assignee: docs@python components: Documentation messages: 293346 nosy: Sam De Meyer, docs@python priority: normal severity: normal status: open title: PyObject_GetIter does not behave as documented on dict objects versions: Python 3.6 _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue30322> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com