python 自定义回调函数

发布时间:2017-7-1 11:33:59编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"python 自定义回调函数 ",主要涉及到python 自定义回调函数 方面的内容,对于python 自定义回调函数 感兴趣的同学可以参考一下。

回调函数用起来比较爽。特别是在js中,满世界全是回调,那么在python中,怎么来优雅地实现自己的回调函数呢

下面贴一个我写的例子

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()

在这里实现的是当self.crawl指定callback方法时,self.crawl会在接收到start_url参数执行完成后回调self.index_url。

而实现方式其实就是通过kwargs获取到callback的对象/字符串,然后通过getattr(self, callback)来反射得到回调的方法,然后调用即可。

接着可以进一步抽象,增加回调方法的复用,于是BaseHandler可以改写成装饰器方式

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):  """在self.crawl(url,callback=$func)时,通过装饰器callback即可实现回调,在self.crawl方法中,只需要专注于得到$func的参数即可"""    @callback    def crawl(self, url, **kwargs):        url = quote_chinese(_build_url(url.strip(), kwargs.get('params')))        return requests.get(url)


上一篇:规则引擎 资料收集
下一篇:Phonegap Android 项目使用Cordova

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款