paul@230 | 1 | class C: |
paul@234 | 2 | def __init__(self): |
paul@234 | 3 | self.a = 1 |
paul@230 | 4 | def m(self, x): |
paul@230 | 5 | return x |
paul@230 | 6 | |
paul@238 | 7 | class D: |
paul@238 | 8 | pass |
paul@238 | 9 | |
paul@238 | 10 | def getc(): |
paul@238 | 11 | return C() |
paul@238 | 12 | |
paul@238 | 13 | def getd(): |
paul@238 | 14 | return D() |
paul@238 | 15 | |
paul@230 | 16 | def f(obj, i): |
paul@230 | 17 | if i: |
paul@234 | 18 | return obj.m(i) # should cause access to an unbound method |
paul@234 | 19 | else: |
paul@234 | 20 | return obj.m |
paul@234 | 21 | |
paul@234 | 22 | def g(obj, i): |
paul@234 | 23 | obj.a # only provided by instances of C |
paul@234 | 24 | if i: |
paul@234 | 25 | return obj.m(i) # should use the method directly since obj is an instance |
paul@230 | 26 | else: |
paul@230 | 27 | return obj.m |
paul@230 | 28 | |
paul@238 | 29 | def h(obj, fn): |
paul@238 | 30 | if fn: |
paul@238 | 31 | obj = fn() |
paul@238 | 32 | obj.a # only provided by instances of C |
paul@238 | 33 | return obj.m(1) |
paul@238 | 34 | else: |
paul@238 | 35 | return obj.m |
paul@238 | 36 | |
paul@230 | 37 | c = C() |
paul@234 | 38 | |
paul@234 | 39 | try: |
paul@234 | 40 | print f(C, 1) # fails |
paul@234 | 41 | except UnboundMethodInvocation: |
paul@234 | 42 | print "f(C, 1): Unbound method is not callable." |
paul@234 | 43 | |
paul@230 | 44 | fn = f(C, 0) |
paul@234 | 45 | |
paul@234 | 46 | try: |
paul@234 | 47 | print fn(2) # fails |
paul@234 | 48 | except UnboundMethodInvocation: |
paul@234 | 49 | print "fn(2): Unbound method is not callable." |
paul@234 | 50 | |
paul@234 | 51 | print get_using(fn, c)(2) # 2 |
paul@234 | 52 | print get_using(f(C, 0), c)(2) # 2 |
paul@234 | 53 | |
paul@237 | 54 | try: |
paul@237 | 55 | print g(C, 1) # should fail with an error caused by a guard |
paul@237 | 56 | except TypeError: |
paul@237 | 57 | print "g(C, 1): C is not a suitable argument." |
paul@237 | 58 | |
paul@234 | 59 | print g(c, 1) # 1 |
paul@234 | 60 | print g(c, 0)(3) # 3 |
paul@238 | 61 | |
paul@238 | 62 | print h(c, getc) # 1 |
paul@238 | 63 | print h(c, 0)(4) # 4 |
paul@238 | 64 | |
paul@238 | 65 | try: |
paul@238 | 66 | print h(c, getd) # should fail with an error caused by a guard |
paul@238 | 67 | except TypeError: |
paul@238 | 68 | print "h(c, getd): getd provides an unsuitable result." |