2016-10-08 | Paul Boddie | raw annotate files changeset graph | Added some support for eliminating accessor class types where the provided attributes are invoked and are unbound methods. This uses a more sophisticated method involving usage observations that incorporate invocation information, permitting classes as accessors if paths through the code support them, even if other paths require instances as accessors to invoke methods. |
1 class C: 2 def c(self): 3 return 1 4 5 class D: 6 def d(self): 7 return 3 8 9 a = 4 10 11 def f(x): 12 x.c() 13 def g(y, x=x): # x must be introduced as default here 14 if y: 15 x = D() 16 return x.d(), y, a # UnboundLocalError in Python (if y is a false value) 17 return g 18 19 result = f(C())(2) 20 assert result == (3, 2, 4)