d...@forestfield.co.uk wrote: > In a program I'm converting to Python 3 I'm examining a list of divisor > values, some of which can be None, to find the first with a value greater > than 1. > > Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] > on win32 Type "help", "copyright", "credits" or "license" for more > information. >>>> None > 1 > False > > Python 3.4.4 (v3.4.4:737efcadf5a6, Dec 20 2015, 20:20:57) [MSC v.1600 64 > bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for > more information. >>>> None > 1 > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > TypeError: unorderable types: NoneType() > int() > > I can live with that but I'm curious why it was decided that this should > now raise an error.
Because allowing comparisons between object of arbitrary type does more harm than benefit? [Python 2] >>> sorted([1, "2", 3]) [1, 3, '2'] In the rare case where you actually want to compare different types you can make that explicit: [Python 3] >>> sorted([1, "2", 3], key=int) [1, '2', 3] >>> sorted([1, "2", 3], key=lambda x: (type(x).__name__, x)) [1, 3, '2'] >>> sorted([1, "2", 3], key=lambda x: (not isinstance(x, str), x)) ['2', 1, 3] >>> from itertools import product >>> for x, y in product([None, 1], repeat=2): ... print(x, ">", y, "-->", (x is not None, x) > (y is not None, y)) ... None > None --> False None > 1 --> False 1 > None --> True 1 > 1 --> False -- https://mail.python.org/mailman/listinfo/python-list