mirror of
https://github.com/python/cpython.git
synced 2026-05-30 06:10:49 +00:00
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.]
|
||
|---|---|---|
| .. | ||
| 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 | ||
| Makefile.in | ||
| 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 | ||