Commit 4f8e5b0a authored by Stefan Behnel's avatar Stefan Behnel

fix 'nonlocal' for class scope

parent f39afe8d
......@@ -1450,6 +1450,17 @@ class PyClassScope(ClassScope):
entry.is_pyclass_attr = 1
return entry
def declare_nonlocal(self, name, pos):
# Pull entry from outer scope into local scope
if self.lookup_here(name):
warning(pos, "'%s' redeclared" % name, 0)
else:
entry = self.lookup(name)
if entry is None:
error(pos, "no binding for nonlocal '%s' found" % name)
else:
self.entries[name] = entry
def add_default_value(self, type):
return self.outer_scope.add_default_value(type)
......
......@@ -119,24 +119,25 @@ def methods():
return c()
return f
# FIXME: doesn't currently work in class namespace:
## def class_body():
## """
## >>> c = f(0)
## >>> c.get()
## 1
## >>> c.x #doctest: +ELLIPSIS
## Traceback (most recent call last):
## AttributeError: ...
## """
## def f(x):
## class c:
## nonlocal x
## x += 1
## def get(self):
## return x
## return c()
def class_body(int x, y):
"""
>>> c = class_body(2,99)
>>> c.z
(3, 2)
>>> c.x #doctest: +ELLIPSIS
Traceback (most recent call last):
AttributeError: ...
>>> c.y #doctest: +ELLIPSIS
Traceback (most recent call last):
AttributeError: ...
"""
class c(object):
nonlocal x
nonlocal y
y = 2
x += 1
z = x,y
return c()
def generator():
"""
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment