ruff
519eca9f - [red-knot] support implicit global name lookups (#12374)

Commit
1 year ago
[red-knot] support implicit global name lookups (#12374) Support falling back to a global name lookup if a name isn't defined in the local scope, in the cases where that is correct according to Python semantics. In class scopes, a name lookup checks the local namespace first, and if the name isn't found there, looks it up in globals. In function scopes (and type parameter scopes, which are function-like), if a name has any definitions in the local scope, it is a local, and accessing it when none of those definitions have executed yet just results in an `UnboundLocalError`, it does not fall back to a global. If the name does not have any definitions in the local scope, then it is an implicit global. Public symbol type lookups never include such a fall back. For example, if a name is not defined in a class scope, it is not available as a member on that class, even if a name lookup within the class scope would have fallen back to a global lookup. This PR makes the `@override` lint rule work again. Not yet included/supported in this PR: * Support for free variables / closures: a free symbol in a nested function-like scope referring to a symbol in an outer function-like scope. * Support for `global` and `nonlocal` statements, which force a symbol to be treated as global or nonlocal even if it has definitions in the local scope. * Module-global lookups should fall back to builtins if the name isn't found in the module scope. I would like to expose nicer APIs for the various kinds of symbols (explicit global, implicit global, free, etc), but this will also wait for a later PR, when more kinds of symbols are supported.
Author
Parents
Loading