New submission from Michał Górny <mgo...@gentoo.org>: While debugging PyPy test failure on backports.lzma [1], I've noticed that PySequence_Check() on a dict type raises TypeError, e.g.:
Traceback (most recent call last): File "test/test_lzma.py", line 273, in test_bad_args b"", format=lzma.FORMAT_RAW, filters={}) File "/home/mgorny/git/backports.lzma/build/lib.linux-x86_64-3.6/backports/lzma/__init__.py", line 463, in decompress decomp = LZMADecompressor(format, memlimit, filters) TypeError: object of type 'dict' has no len() The relevant C code is: static int parse_filter_chain_spec(lzma_filter filters[], PyObject *filterspecs) { Py_ssize_t i, num_filters; num_filters = PySequence_Length(filterspecs); ... where filterspecs is the object corresponding to the {} dict in Python snippet. According to the documentation [2], PySequence_Length() should be 'equivalent to the Python expression len(o).' The Python expression obviously does not raise TypeError: >>> len({}) 0 Therefore, I think that the behavior of PySequence_Length() is a bug, and the function should successfully return the dict length instead. [1]:https://github.com/peterjc/backports.lzma [2]:https://docs.python.org/3/c-api/sequence.html#c.PySequence_Length ---------- components: Extension Modules messages: 309534 nosy: mgorny priority: normal severity: normal status: open title: PySequence_Length() raises TypeError on dict type type: behavior versions: Python 2.7, Python 3.4, Python 3.5, Python 3.6 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue32500> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com