python构建自定义回调函数详解


Posted in Python onJune 20, 2017

回调函数用起来比较爽。特别是在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.text

a = Anjuke()
print a.on_start()

其实就是通过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 wrapper


class BaseHandler(object):

  @callback
  def crawl(self, url, **kwargs):
    url = quote_chinese(_build_url(url.strip(), kwargs.get('params')))
    return requests.get(url)
Python 相关文章推荐
Python单元测试框架unittest简明使用实例
Apr 13 Python
两个命令把 Vim 打造成 Python IDE的方法
Mar 20 Python
Python科学计算之NumPy入门教程
Jan 15 Python
Python 专题四 文件基础知识
Mar 20 Python
Python上下文管理器和with块详解
Sep 09 Python
Python走楼梯问题解决方法示例
Jul 25 Python
PyQt QListWidget修改列表项item的行高方法
Jun 20 Python
python脚本调用iftop 统计业务应用流量的思路详解
Oct 11 Python
Python实现基于socket的udp传输与接收功能详解
Nov 15 Python
python爬虫要用到的库总结
Jul 28 Python
Python变量格式化输出实现原理解析
Aug 06 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
Sep 16 Python
Python实现完整的事务操作示例
Jun 20 #Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
Jun 20 #Python
Python实现多并发访问网站功能示例
Jun 19 #Python
Python sqlite3事务处理方法实例分析
Jun 19 #Python
Python之str操作方法(详解)
Jun 19 #Python
python urllib爬取百度云连接的实例代码
Jun 19 #Python
Python的IDEL增加清屏功能实例
Jun 19 #Python
You might like
新浪SAE云平台下使用codeigniter的数据库配置
2014/06/12 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
js分页代码分享
2014/04/28 Javascript
Javascript中设置默认参数值示例
2014/09/11 Javascript
NodeJS使用jQuery选择器操作DOM
2015/02/13 NodeJs
jQuery mobile类库使用时加载导航历史的方法简介
2015/12/04 Javascript
Bootstrap 布局组件(全)
2016/07/18 Javascript
微信小程序 石头剪刀布实例代码
2017/01/04 Javascript
js实现1,2,3,5数字按照概率生成
2017/09/12 Javascript
原生js实现ajax请求和JSONP跨域请求操作示例
2020/03/14 Javascript
小程序点餐界面添加购物车左右摆动动画
2020/09/23 Javascript
jQuery实现电梯导航模块
2020/12/22 jQuery
Python3.2中的字符串函数学习总结
2015/04/23 Python
Python基于PycURL实现POST的方法
2015/07/25 Python
Python实现简单多线程任务队列
2016/02/27 Python
python数据结构之链表的实例讲解
2017/07/25 Python
利用python打印出菱形、三角形以及矩形的方法实例
2017/08/08 Python
将Dataframe数据转化为ndarry数据的方法
2018/06/28 Python
详解python运行三种方式
2019/05/13 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
python 叠加等边三角形的绘制的实现
2019/08/14 Python
pandas 中对特征进行硬编码和onehot编码的实现
2019/12/20 Python
利用Vscode进行Python开发环境配置的步骤
2020/06/22 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
新加坡网上美容店:Hermo新加坡
2019/06/19 全球购物
印度手工编织服装和家居用品商店:Fabindi
2019/10/07 全球购物
super()与this()的区别
2016/01/17 面试题
通用C#笔试题附答案
2016/11/26 面试题
如何理解transaction事务的概念
2015/05/27 面试题
葡萄牙语专业个人求职信
2013/12/10 职场文书
《木笛》教学反思
2014/03/01 职场文书
职称评定自我鉴定
2014/03/18 职场文书
酒店温馨提示语
2015/07/14 职场文书
Python tensorflow卷积神经Inception V3网络结构
2022/05/06 Python
python标准库ElementTree处理xml
2022/05/20 Python
flex布局中使用flex-wrap实现换行的项目实践
2022/06/21 HTML / CSS