how to assert that method accepts specific types

Chris Rebert clp2 at rebertia.com
Sat Feb 21 02:20:02 CET 2009


On Fri, Feb 20, 2009 at 5:12 PM, Darren Dale <dsdale24 at gmail.com> wrote:
> I would like to assert that a method accepts certain types. I have a
> short example that works:
>
> from functools import wraps
>
> def accepts(*types):
>    def check_accepts(f):
>        @wraps(f)
>        def new_f(self, other):
>            assert isinstance(other, types), \
>                "arg %r does not match %s" % (other, types)
>            return f(self, other)
>        return new_f
>    return check_accepts
>
> class Test(object):
>
>    @accepts(int)
>    def check(self, obj):
>        print obj
>
> t = Test()
> t.check(1)
>
> but now I want Test.check to accept an instance of Test as well. Does
> anyone know how this can be accomplished? The following class
> definition for Test raises a NameError:
>
> class Test(object):
>
>    @accepts(int, Test)
>    def check(self, obj):
>        print obj

You're going to have to either inject it after the class definition
somehow, or give the class name as a string and use eval() or similar.
The class object doesn't exist until the entire class body has
finished executing, so you can't refer to the class within its own
body.

Cheers,
Chris

-- 
Follow the path of the Iguana...
http://rebertia.com



More information about the Python-list mailing list