Change error message raised when free variable is not yet bound. It

now raises NameError instead of UnboundLocalError, because the var in
question is definitely not local.  (This affects test_scope.py)

Also update the recent fix by Ping using get_func_name().  Replace
tests of get_func_name() return value with call to get_func_desc() to
match all the other uses.
This commit is contained in:
Jeremy Hylton 2001-04-13 16:51:46 +00:00
parent 62effc1127
commit c76770c68c
2 changed files with 18 additions and 11 deletions

View File

@ -291,7 +291,7 @@ else:
try:
errorInInner()
except UnboundLocalError:
except NameError:
pass
else:
raise TestFailed
@ -435,3 +435,4 @@ d = f(2)(4)
verify(d.has_key('h'))
del d['h']
verify(d == {'x': 2, 'y': 7, 'w': 6})

View File

@ -83,6 +83,9 @@ static void format_exc_check_arg(PyObject *, char *, PyObject *);
"global name '%.200s' is not defined"
#define UNBOUNDLOCAL_ERROR_MSG \
"local variable '%.200s' referenced before assignment"
#define UNBOUNDFREE_ERROR_MSG \
"free variable '%.200s' referenced before assignment" \
" in enclosing scope"
/* Dynamic execution profile */
#ifdef DYNAMIC_EXECUTION_PROFILE
@ -1693,18 +1696,22 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
x = freevars[oparg];
w = PyCell_Get(x);
if (w == NULL) {
if (oparg < f->f_ncells)
if (oparg < f->f_ncells) {
v = PyTuple_GetItem(co->co_cellvars,
oparg);
else
v = PyTuple_GetItem(
co->co_freevars,
oparg - f->f_ncells);
format_exc_check_arg(
PyExc_UnboundLocalError,
UNBOUNDLOCAL_ERROR_MSG,
v);
} else {
v = PyTuple_GetItem(
co->co_freevars,
oparg - f->f_ncells);
format_exc_check_arg(
PyExc_NameError,
UNBOUNDFREE_ERROR_MSG,
v);
}
err = -1;
break;
}
@ -2883,11 +2890,10 @@ call_method(PyObject *func, PyObject *arg, PyObject *kw)
return NULL;
}
if (!ok) {
char* fn = get_func_name(func);
PyErr_Format(PyExc_TypeError,
"unbound method %s%s must be "
"called with instance as first argument",
fn ? fn : "", fn ? "() " : "");
get_func_name(func), get_func_desc(func));
return NULL;
}
Py_INCREF(arg);