Last active
September 22, 2015 16:00
-
-
Save juggernate/c9720fe375cd2bfa919e to your computer and use it in GitHub Desktop.
Decorator to check method param types
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 example(): | |
@accepts(Exception,a=int,b=list,c=(str,unicode)) | |
def test(a,b=None,c=None) | |
print 'ok' | |
test(13,c=[],b='df') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment