Is it possible to change the behaviour of global and local variables in Python at runtime?
In Python, locals() gives references to variables in the current execution scope, which is a dict object.
>>> locals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}
Is it possible to replace that reference returned by locals() to a defaultdict, but keep the previous values (a copy of locals()) before replacing it?
I would expect this to avoid UnboundLocalException exceptions when using uninitialized variables and access any variable name in the execution scope (uninitialized variables would take a specified default value).
I've tried to modify the value returned by locals() by reassigning it to locals without success.
The same question goes for globals().
No, you can't.
locals()is just a reflection of the actual namespace used for functions.For performance reasons, the actual namespace is an array and locals are not looked up by name but by index. You can't add new names to this after the fact, because the compiler has simply not accounted for more references in the array.
Note that
NameErrorexceptions are thrown for missing globals, not locals. Local names, if not yet bound, throw anUnboundLocalExceptioninstead. You can't replace theglobals()dictionary with a defaultdict either, however; the__dict__attribute of module objects is read-only. Even if it wasn't read-only, only the built-indicttype is supported due to the way names are looked up in the namespace; this is by design.