Ticket #16537: rich-cmp-comparison-1.py

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