First of all Python 2 allowed comparing all types of mixed types. This wart was fixed in Python 3 eventually.
CPython implementation detail: Objects of different types except
numbers are ordered by their type names; objects of the same types
that don’t support proper comparison are ordered by their address.
For None
a quick decision was made by Guido and Tim Peters and it resulted in this commit in Python 2.1(emphasis mine):
Part of fixing that was removing some cases of "compare objects of
different types by comparing the type name strings". Guido & I were
both in the office at the time, and one said to the other: "what about
None
? Comparing that to other types via comparing the string 'None'
doesn't make much sense." "Ya, OK ... how about changing None
to - by
default - comparing 'less than' objects of other types?" "Don't see
why not - sure." "OK, done!
No more than 2 minutes of thought went into it. There was no intent
to cater to any real use case here - the only intent was to pick some
arbitrary-but-consistent rule that didn't suck quite as badly as
pretending None was the string "None" ;-)