• Guido van Rossum's avatar
    Patch by Tim Peters: · 87460821
    Guido van Rossum yazdı
    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.]
    87460821
pyerrors.h 4.46 KB