Function name unchanged in error message

Peter Otten __peter__ at web.de
Fri Jan 29 09:22:56 EST 2010


andrew cooke wrote:

> Is there any way to change the name of the function in an error
> message?  In the example below I'd like the error to refer to bar(),
> for example (the motivation is related function decorators - I'd like
> the wrapper function to give the same name)
> 
>>>> def foo():
> ...     return 7
> ...
>>>> foo.__name__ = 'bar'
>>>> foo(123)
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> TypeError: foo() takes no arguments (1 given)

The name is looked up in the code object. As that is immutable you have to 
make a new one:

argnames = 'argcount nlocals stacksize flags code consts names varnames 
filename name firstlineno lnotab'.split()

def f(): return 42

code = type(f.func_code)
function = type(f)

def make_code(proto, **kw):
    for name in argnames:
        if name not in kw:
            kw[name] = getattr(proto, "co_" + name)
    values = [kw[name] for name in argnames]
    return code(*values)

if __name__ == "__main__":
    def foo():
        print "foo"

    c = make_code(foo.func_code, name="bar")
    foo.func_code = c

    foo(42)

Peter



More information about the Python-list mailing list