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

fix 'nonlocal' for class scope

parent f39afe8d
...@@ -1450,6 +1450,17 @@ class PyClassScope(ClassScope): ...@@ -1450,6 +1450,17 @@ class PyClassScope(ClassScope):
entry.is_pyclass_attr = 1 entry.is_pyclass_attr = 1
return entry 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): def add_default_value(self, type):
return self.outer_scope.add_default_value(type) return self.outer_scope.add_default_value(type)
......
...@@ -119,24 +119,25 @@ def methods(): ...@@ -119,24 +119,25 @@ def methods():
return c() return c()
return f return f
# FIXME: doesn't currently work in class namespace: def class_body(int x, y):
"""
## def class_body(): >>> c = class_body(2,99)
## """ >>> c.z
## >>> c = f(0) (3, 2)
## >>> c.get() >>> c.x #doctest: +ELLIPSIS
## 1 Traceback (most recent call last):
## >>> c.x #doctest: +ELLIPSIS AttributeError: ...
## Traceback (most recent call last): >>> c.y #doctest: +ELLIPSIS
## AttributeError: ... Traceback (most recent call last):
## """ AttributeError: ...
## def f(x): """
## class c: class c(object):
## nonlocal x nonlocal x
## x += 1 nonlocal y
## def get(self): y = 2
## return x x += 1
## return c() z = x,y
return c()
def generator(): 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