回調(diào)函數(shù)用起來(lái)比較爽。特別是在js中,滿(mǎn)世界全是回調(diào),那么在python/272742.html">python/265853.html">python中,怎么來(lái)優(yōu)雅地實(shí)現(xiàn)自己的回調(diào)函數(shù)呢
下面貼一個(gè)我寫(xiě)的例子
class BaseHandler(object): def crawl(self, url, **kwargs): if kwargs.get('callback'): callback = kwargs['callback'] if isinstance(callback, basestring) and hasattr(self, callback): func = getattr(self, callback) elif hasattr(callback, 'im_self') and callback.im_self is self: func = callback resp = requests.get(url) return func(resp)class Anjuke(BaseHandler): def on_start(self): self.crawl(start_url, callback=self.index_url) def index_url(self, response): print response.texta = Anjuke()print a.on_start()其實(shí)就是通過(guò)kwargs獲取到callback的對(duì)象/字符串,然后通過(guò)getattr(self, callback)來(lái)反射得到回調(diào)的方法,然后調(diào)用即可。
接著可以進(jìn)一步抽象,增加回調(diào)方法的復(fù)用,于是BaseHandler可以改寫(xiě)成裝飾器方式
def callback(f): def wrapper(obj, *args, **kwargs): resp = f(obj, *args, **kwargs) if kwargs.get('callback'): mcallback = kwargs['callback'] if isinstance(callback, basestring) and hasattr(obj, mcallback): func = getattr(obj, mcallback) elif hasattr(mcallback, 'im_self') and mcallback.im_self is obj: func = mcallback kwargs['callback'] = func.__name__ else: raise NotImplementedError("self.%s() not implemented!" % callback) return func(resp) return wrapperclass BaseHandler(object): @callback def crawl(self, url, **kwargs): url = quote_chinese(_build_url(url.strip(), kwargs.get('params'))) return requests.get(url)新聞熱點(diǎn)
疑難解答
圖片精選