[issue24434] ItemsView.__contains__ does not mimic dict_items
Changes by Caleb Levy caleb.l...@berkeley.edu: -- components: Library (Lib) nosy: clevy, rhettinger, stutzbach priority: normal severity: normal status: open title: ItemsView.__contains__ does not mimic dict_items type: behavior versions: Python 2.7, Python 3.2, Python 3.3, Python 3.4, Python 3.5, Python 3.6 ___ Python tracker rep...@bugs.python.org http://bugs.python.org/issue24434 ___ ___ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue24434] ItemsView.__contains__ does not mimic dict_items
New submission from Caleb Levy: The current implementation ItemsView.__contains__ reads class ItemsView(MappingView, Set): ... def __contains__(self, item): key, value = item try: v = self._mapping[key] except KeyError: return False else: return v == value ... This poses several problems. First, any non-iterable or iterable not having exactly two elements will raise an error instead of returning false. Second, an ItemsView object is roughly the same as a set of tuple-pairs hashed by the first element. Thus, for example, [a, 1] in d.items() will return False for any dict d, yet in the current ItemsView implementation, this is True. The patch changes behavior to immediately return false for non-tuple items and tuples not of length 2, avoiding unnecessary exceptions. It also adds tests to collections which fail under the old behavior and pass with the update. -- keywords: +patch Added file: http://bugs.python.org/file39682/ItemsView_contains.patch ___ Python tracker rep...@bugs.python.org http://bugs.python.org/issue24434 ___ ___ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue24434] ItemsView.__contains__ does not mimic dict_items
Caleb Levy added the comment: @serhiy.storchaka: I don't think that will work. First of all, x, y = item will raise a ValueError if fed an iterable whose length is not exactly 2, so you would have to check for that. Moreover, if item is something like a dict, for example, then: {a: 1, b: 2} in DictLikeMapping(a=b) could return True, which I don't think would be expected behavior. I'm not terribly fond of the instance check myself, but in this case I can't see any other way to do it: the built in dict_items necessarily consists of *tuples* of key-value pairs. -- ___ Python tracker rep...@bugs.python.org http://bugs.python.org/issue24434 ___ ___ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue24434] ItemsView.__contains__ does not mimic dict_items
Caleb Levy added the comment: Sorry; that should be DictLikeMapping(a=b).items(), where DictLikeMapping is defined in the patch unit tests. -- ___ Python tracker rep...@bugs.python.org http://bugs.python.org/issue24434 ___ ___ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com