Created
January 15, 2014 11:51
-
-
Save creotiv/8434887 to your computer and use it in GitHub Desktop.
Decorator to check method param types. This solution give possibility to check method param type, raise needed exception type, and also have good readability in the decorator definition.
This file contains hidden or 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 exmaple(): | |
@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