python构建自定义回调函数详解
回调函数用起来比较爽。特别是在js中,满世界全是回调,那么在python中,怎么来优雅地实现自己的回调函数呢
下面贴一个我写的例子
classBaseHandler(object):
defcrawl(self,url,**kwargs):
ifkwargs.get('callback'):
callback=kwargs['callback']
ifisinstance(callback,basestring)andhasattr(self,callback):
func=getattr(self,callback)
elifhasattr(callback,'im_self')andcallback.im_selfisself:
func=callback
resp=requests.get(url)
returnfunc(resp)
classAnjuke(BaseHandler):
defon_start(self):
self.crawl(start_url,callback=self.index_url)
defindex_url(self,response):
printresponse.text
a=Anjuke()
printa.on_start()
其实就是通过kwargs获取到callback的对象/字符串,然后通过getattr(self,callback)来反射得到回调的方法,然后调用即可。
接着可以进一步抽象,增加回调方法的复用,于是BaseHandler可以改写成装饰器方式
defcallback(f):
defwrapper(obj,*args,**kwargs):
resp=f(obj,*args,**kwargs)
ifkwargs.get('callback'):
mcallback=kwargs['callback']
ifisinstance(callback,basestring)andhasattr(obj,mcallback):
func=getattr(obj,mcallback)
elifhasattr(mcallback,'im_self')andmcallback.im_selfisobj:
func=mcallback
kwargs['callback']=func.__name__
else:
raiseNotImplementedError("self.%s()notimplemented!"%callback)
returnfunc(resp)
returnwrapper
classBaseHandler(object):
@callback
defcrawl(self,url,**kwargs):
url=quote_chinese(_build_url(url.strip(),kwargs.get('params')))
returnrequests.get(url)