On Thu, Jul 25, 2019 at 05:53:47PM +0200, Antoine Pitrou wrote: > On Wed, 24 Jul 2019 19:09:37 -0400 > David Mertz <me...@gnosis.cx> wrote: > > > > There are various possible behaviors that might make sense, but having > > `d.values() != d.values()` is about the only one I can see no sense in. > > Why? Does the following make no sense to you? > > >>> iter(()) == iter(()) > False
Views are not iterators, and the analogy is a poor one. In their own way, iterators are almost as weird as NANs. (Not *quite* as weird, since NANs break reflexivity too: x != x when x is a NAN.) But having two iterators which clearly yield the same values in the same order compare as unequal is weird. ("Same values in same order" includes the pair of exhausted iterator case.) The behaviour of iterators can be justified, and I'm not going to argue that it should be changed. For starters iterators are not *containers*, they are conceptually more of a process (yielding values one at a time). But we shouldn't emulate iterator behaviour in objects which aren't like iterators. Views are collections. They are sized, containers (support ``in``), and iterable: py> v = {'a': 1, 'b': 2}.values() py> len(v) 2 py> 2 in v True py> list(v) [1, 2] and unlike iterators, iterating over a view doesn't exhaust it. Conceptually, equality of two values view objects should be easy (if we don't care about efficiency of implementation). Two views are equal if they have the same length, and each value occurs the same number of times. Value views don't currently support the .count() method, but if they did, we could say two value views a, b were equal if: len(a) == len(b) and all(a.count(x) == b.count(x) for x in a) The .count method could be implemented like this: def count(self, x): n = 0 for a in self: if a == x: n += 1 return n So there are no conceptual problems in defining equality for value views. Putting aside efficiency, this is easy to solve. -- Steven _______________________________________________ Python-Dev mailing list -- python-dev@python.org To unsubscribe send an email to python-dev-le...@python.org https://mail.python.org/mailman3/lists/python-dev.python.org/ Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/TSAOXOEXRIE5PXZ2DYR2KKDLTPRCHIHI/