It’s because __lt__() and related comparison methods are quite commonly used indirectly in list sorts and such. Sometimes the algorithm will choose to try another way or pick a default winner. Raising an exception would break out of the sort unless caught, whereas NotImplemented doesn’t get raised and can be used in further tests.
http://jcalderone.livejournal.com/32837.html
To summarise that link:
“
NotImplementedsignals to the runtime that it should ask someone else to satisfy the operation. In the expressiona == b, ifa.__eq__(b)returnsNotImplemented, then Python triesb.__eq__(a). Ifbknows enough to returnTrueorFalse, then the expression can succeed. If it doesn’t, then the runtime will fall back to the built-in behavior (which is based on identity for==and!=).”