Welcome, guest | Sign In | My Account | Store | Cart

This solution give possibility to check method param type, raise needed exception type, and also have good readability in the decorator definition.

Python, 30 lines
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
def accepts(exception,**types):
    def check_accepts(f):
        assert len(types) == f.func_code.co_argcount, \
        'accept number of arguments not equal with function number of arguments in "%s"' % f.func_name
        def new_f(*args, **kwds):
            for i,v in enumerate(args):
                if types.has_key(f.func_code.co_varnames[i]) and \
                    not isinstance(v, types[f.func_code.co_varnames[i]]):
                    raise exception("arg '%s'=%r does not match %s" % \
                        (f.func_code.co_varnames[i],v,types[f.func_code.co_varnames[i]]))
                    del types[f.func_code.co_varnames[i]]

            for k,v in kwds.iteritems():
                if types.has_key(k) and not isinstance(v, types[k]):
                    raise exception("arg '%s'=%r does not match %s" % \
                        (k,v,types[k]))

            return f(*args, **kwds)
        new_f.func_name = f.func_name
        return new_f
    return check_accepts


def exmaple():

    @accepts(Exception,a=int,b=list,c=(str,unicode))
    def test(a,b=None,c=None)
        print 'ok'

    test(13,c=[],b='df') 
Created by Andrey Nikishaev on Tue, 14 Jan 2014 (MIT)
Python recipes (4591)
Andrey Nikishaev's recipes (7)

Required Modules

  • (none specified)

Other Information and Tasks