mirror of https://github.com/python/cpython
8746082175
Introduce a new builtin exception, UnboundLocalError, raised when ceval.c tries to retrieve or delete a local name that isn't bound to a value. Currently raises NameError, which makes this behavior a FAQ since the same error is raised for "missing" global names too: when the user has a global of the same name as the unbound local, NameError makes no sense to them. Even in the absence of shadowing, knowing whether a bogus name is local or global is a real aid to quick understanding. Example: D:\src\PCbuild>type local.py x = 42 def f(): print x x = 13 return x f() D:\src\PCbuild>python local.py Traceback (innermost last): File "local.py", line 8, in ? f() File "local.py", line 4, in f print x UnboundLocalError: x D:\src\PCbuild> Note that UnboundLocalError is a subclass of NameError, for compatibility with existing class-exception code that may be trying to catch this as a NameError. Unfortunately, I see no way to make this wholly compatible with -X (see comments in bltinmodule.c): under -X, [UnboundLocalError is an alias for NameError --GvR]. [The ceval.c patch differs slightly from the second version that Tim submitted; I decided not to raise UnboundLocalError for DELETE_NAME, only for DELETE_LOCAL. DELETE_NAME is only generated at the module level, and since at that level a NameError is raised for referencing an undefined name, it should also be raised for deleting one.] |
||
---|---|---|
.. | ||
Makefile.in | ||
atof.c | ||
bltinmodule.c | ||
ceval.c | ||
compile.c | ||
dup2.c | ||
errors.c | ||
fmod.c | ||
frozen.c | ||
frozenmain.c | ||
getargs.c | ||
getcompiler.c | ||
getcopyright.c | ||
getcwd.c | ||
getmtime.c | ||
getopt.c | ||
getplatform.c | ||
getversion.c | ||
graminit.c | ||
hypot.c | ||
import.c | ||
importdl.c | ||
importdl.h | ||
marshal.c | ||
memmove.c | ||
modsupport.c | ||
mystrtoul.c | ||
pyfpe.c | ||
pystate.c | ||
pythonmain.c | ||
pythonrun.c | ||
sigcheck.c | ||
strdup.c | ||
strerror.c | ||
strtod.c | ||
structmember.c | ||
sysmodule.c | ||
thread.c | ||
thread_beos.h | ||
thread_cthread.h | ||
thread_foobar.h | ||
thread_lwp.h | ||
thread_nt.h | ||
thread_os2.h | ||
thread_pthread.h | ||
thread_sgi.h | ||
thread_solaris.h | ||
thread_wince.h | ||
traceback.c |