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)