SyntaxError nonlocal python in a method defenition


I’m typing in an interactive mode the following code:

class A:
    def foo():
        nonlocal a

but I’ve a SyntaxError: no binding for nonlocal 'a' found. But I’m expected that the result of resolution nonlocal a will be 42, because the nearest enclosing scope for this method is a class block.

Asked By: user2953119



What you’re doing is creating a class which has a class attribute a, with a default value of 42. You can refer to that attribute by A.a. If you want to use it within the class, use self.a.

Answered By: msvalkon

Class scope are handled in a special way by Python: When looking for names in ecnlosing scopes, class scopes are skipped.

To access a name from the class scope either use self.a to look up via the instance or A.a to look up via the class.

See The scope of names defined in class block doesn’t extend to the methods’ blocks. Why is that? for a rationale for this behaviour.

Answered By: Sven Marnach
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.