mirror of
https://github.com/python/cpython.git
synced 2024-11-28 16:45:42 +01:00
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.] |
||
---|---|---|
.. | ||
abstract.h | ||
bitset.h | ||
bufferobject.h | ||
ceval.h | ||
classobject.h | ||
cobject.h | ||
compile.h | ||
complexobject.h | ||
config.h | ||
cStringIO.h | ||
dictobject.h | ||
errcode.h | ||
eval.h | ||
fileobject.h | ||
floatobject.h | ||
frameobject.h | ||
funcobject.h | ||
graminit.h | ||
grammar.h | ||
import.h | ||
intobject.h | ||
intrcheck.h | ||
listobject.h | ||
longintrepr.h | ||
longobject.h | ||
Makefile | ||
marshal.h | ||
metagrammar.h | ||
methodobject.h | ||
modsupport.h | ||
moduleobject.h | ||
mymalloc.h | ||
mymath.h | ||
myproto.h | ||
myselect.h | ||
mytime.h | ||
node.h | ||
object.h | ||
objimpl.h | ||
opcode.h | ||
osdefs.h | ||
parsetok.h | ||
patchlevel.h | ||
pgenheaders.h | ||
pydebug.h | ||
pyerrors.h | ||
pyfpe.h | ||
pystate.h | ||
Python.h | ||
pythonrun.h | ||
pythread.h | ||
rangeobject.h | ||
rename1.h | ||
rename2.h | ||
sliceobject.h | ||
stringobject.h | ||
structmember.h | ||
sysmodule.h | ||
thread.h | ||
token.h | ||
traceback.h | ||
tupleobject.h |