Sometimes the Python name resolution is explained using a LEGB rule.
For instance, in [1] (I think also the Learning Python book gives the same):

"if a particular name:object mapping cannot be found in the local namespaces, the namespaces of the enclosed scope are being searched next. If the search in the enclosed scope is unsuccessful, too, Python moves on to the global namespace, and eventually, it will search the built-in namespace (side note: if a name cannot found in any of the namespaces, a NameError will is raised)."

AFAIK, Python has static scoping: the scope for a name is given during the bytecode compilation. This means that before executing the program, Python already know in which namespace to look for an object. So, it seems to me that the LEGB rule is wrong, and this is what actually happens:

* local name (LOAD_FAST instruction): Python looks (only) in the local namespace, and if it does not find the name, then it raises an UnboundLocalError

* global name (LOAD_GLOBAL): at first Python looks in the globals(), and in case the name is not there, it looks in the builtins namespace; if the name is neither in the global nor in the builtin namespace, it raises a NameError

* enclosing scope (LOAD_DEREF): there is a closure, and Python looks for the name in the enclosing namespace

Is that right, or am I missing something? Thanks, Marco

[1] http://sebastianraschka.com/Articles/2014_python_scope_and_namespaces.html

--
Marco Buttu

INAF-Osservatorio Astronomico di Cagliari
Via della Scienza n. 5, 09047 Selargius (CA)
Phone: 070 711 80 217
Email: mbu...@oa-cagliari.inaf.it

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to