]> granicus.if.org Git - python/commitdiff
Change error message raised when free variable is not yet bound. It
authorJeremy Hylton <jeremy@alum.mit.edu>
Fri, 13 Apr 2001 16:51:46 +0000 (16:51 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Fri, 13 Apr 2001 16:51:46 +0000 (16:51 +0000)
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.

Lib/test/test_scope.py
Python/ceval.c

index d6367b24fb9d4ae53e36aa3fe15b0ccafc92d00a..358c45a0a127bda0ddc747ba814b15aa494a8f33 100644 (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})
+
index a1b3bc2865652ccc33d665e77ea2d8e84da9e323..b6686b6e1bf8648fdc6fcb382215ac5cabef09c7 100644 (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
+                                      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_UnboundLocalError,
-                                       UNBOUNDLOCAL_ERROR_MSG,
-                                       v);
+                                      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%smust be "
+                                    "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);