Ticket #16537: experiments-with-rich-comparison.py

File experiments-with-rich-comparison.py, 1.5 KB (added by wluebbe, 8 years ago)

Python script to demonstrate some "features" of rich comparison.

Line 
1from __future__ import print_function
2from functools import total_ordering
3from itertools import product
4import sys
5
6print(sys.version)
7
8for eq, ne, lt, total in product((True, False), repeat=4):
9    print('%s\neq= %-5s, ne= %-5s, lt= %-5s, total= %-5s' % ('='*50, eq, ne, lt, total))
10   
11    #@total_ordering
12    class TestClass(object):
13        def __init__(self, val):
14            self.val = val
15        def __str__(self):
16            return 'TestClass(val=%s)' % self.val
17   
18        if eq:
19            def __eq__(self, other):
20                return self.val == other.val
21        if ne:
22            def __ne__(self, other):
23                return not self == other
24        if lt:
25            def __lt__(self, other):
26                return self.val < other.val
27    if total:
28        try:
29            TestClass = total_ordering(TestClass)
30        except ValueError as err:
31            print(err)
32            continue
33   
34   
35    for v1, v2 in ['aa', 'ab', 'ba']:
36        t1 = TestClass(v1)
37        t2 = TestClass(v2)
38        print('t1= %s, id= %s' % (t1, id(t1)))
39        print('t2= %s, id= %s\n' % (t2, id(t2)))
40   
41        for op in ['==', '!=', '< ', '<=', '> ', '>=']:
42            try: 
43                cmp_t = eval('t1'+op+'t2')
44            except TypeError:
45                cmp_t = 'TypeError'
46            cmp_v = eval('v1'+op+'v2')
47            cmp_id = eval(str(id(t1))+op+str(id(t2)))
48            ok = 'OK' if cmp_t==cmp_v else ''
49            print('t1%st2: %-9s (val: %-5s; id: %-5s) %s' %
50                  (op, cmp_t, cmp_v, cmp_id, ok))
51        print('-'*50)
52