summaryrefslogtreecommitdiffstatshomepage
path: root/tests/basics/class_bind_self.py
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2015-12-26 12:41:31 +0000
committerDamien George <damien.p.george@gmail.com>2015-12-26 12:41:31 +0000
commit78913211a9532ff952f5628c7c94848bd59a4a11 (patch)
treed0a87488951bcb98ff0958c2f384d5dde53cd848 /tests/basics/class_bind_self.py
parent84b245f187f9711357b1fd46bebc67266bd028e5 (diff)
downloadmicropython-78913211a9532ff952f5628c7c94848bd59a4a11.tar.gz
micropython-78913211a9532ff952f5628c7c94848bd59a4a11.zip
py: Be more restrictive binding self when looking up instance attrs.
When looking up and extracting an attribute of an instance, some attributes must bind self as the first argument to make a working method call. Previously to this patch, any attribute that was callable had self bound as the first argument. But Python specs require the check to be more restrictive, and only functions, closures and generators should have self bound as the first argument Addresses issue #1675.
Diffstat (limited to 'tests/basics/class_bind_self.py')
-rw-r--r--tests/basics/class_bind_self.py54
1 files changed, 54 insertions, 0 deletions
diff --git a/tests/basics/class_bind_self.py b/tests/basics/class_bind_self.py
new file mode 100644
index 0000000000..16e4f5ac95
--- /dev/null
+++ b/tests/basics/class_bind_self.py
@@ -0,0 +1,54 @@
+# test for correct binding of self when accessing attr of an instance
+
+class A:
+ def __init__(self, arg):
+ self.val = arg
+ def __str__(self):
+ return 'A.__str__ ' + str(self.val)
+ def __call__(self, arg):
+ return 'A.__call__', arg
+ def foo(self, arg):
+ return 'A.foo', self.val, arg
+
+def make_closure(x_in):
+ x = x_in
+ def closure(y):
+ return x, y is c
+ return closure
+
+class C:
+ # these act like methods and bind self
+
+ def f1(self, arg):
+ return 'C.f1', self is c, arg
+ f2 = lambda self, arg: ('C.f2', self is c, arg)
+ f3 = make_closure('f3') # closure
+ def f4(self, arg): # generator
+ yield self is c, arg
+
+ # these act like simple variables and don't bind self
+
+ f5 = int # builtin type
+ f6 = abs # builtin function
+ f7 = A # user type
+ f8 = A(8) # user instance which is callable
+ f9 = A(9).foo # user bound method
+
+c = C()
+print(c.f1(1))
+print(c.f2(2))
+print(c.f3())
+print(next(c.f4(4)))
+print(c.f5(5))
+#print(c.f6(-6)) not working in uPy
+print(c.f7(7))
+print(c.f8(8))
+print(c.f9(9))
+
+# not working in uPy
+#class C(list):
+# # this acts like a method and binds self
+# f1 = list.extend
+#c = C()
+#c.f1([3, 1, 2])
+#print(c)