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实现的个人所得税计算器示例
Jun 01 Python
Python实现重建二叉树的三种方法详解
Jun 23 Python
在python里从协程返回一个值的示例
Feb 19 Python
python try 异常处理(史上最全)
Mar 07 Python
Django 开发环境与生产环境的区分详解
Jul 26 Python
Python Django 命名空间模式的实现
Aug 09 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
Oct 17 Python
Docker部署Python爬虫项目的方法步骤
Jan 19 Python
Tensorflow进行多维矩阵的拆分与拼接实例
Feb 07 Python
在python3中实现更新界面
Feb 21 Python
PIL包中Image模块的convert()函数的具体使用
Feb 26 Python
Django 解决由save方法引发的错误
May 21 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
PHP 第三节 变量介绍
2012/04/28 PHP
PHP中全局变量global和$GLOBALS[]的区别分析
2012/08/06 PHP
web server使用php生成web页面的三种方法总结
2013/10/28 PHP
PHP的cURL库简介及使用示例
2015/02/06 PHP
PHP获取数组长度或某个值出现次数的方法
2015/02/11 PHP
PHP保存session到memcache服务器的方法
2016/01/19 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
2016/09/11 PHP
thinkphp下MySQL数据库读写分离代码剖析
2017/04/18 PHP
PHP写的简单数字验证码实例
2017/05/23 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
关于javascript中的typeof和instanceof介绍
2012/12/04 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
很好用的js日历算法详细代码
2013/03/07 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
JavaScript实现显示函数调用堆栈的方法
2016/04/21 Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
2016/06/07 Javascript
浅谈Javascript中的12种DOM节点类型
2016/08/19 Javascript
vue router学习之动态路由和嵌套路由详解
2017/09/21 Javascript
让网站自动生成章节目录索引的多个js代码
2018/01/07 Javascript
js正则相关知识点专题
2018/05/10 Javascript
js实现敏感词过滤算法及实现逻辑
2018/07/24 Javascript
JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】
2019/02/21 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
2019/12/02 Javascript
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
javascript实现时钟动画
2020/12/03 Javascript
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
2015/03/19 Python
快速实现一个简单的canvas迷宫游戏的示例
2018/07/04 HTML / CSS
Bally巴利英国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/07 全球购物
JD Sports荷兰:英国领先的运动时尚零售商
2020/03/13 全球购物
应聘自荐书
2013/10/08 职场文书
支教个人总结
2015/03/04 职场文书
离婚起诉书范文2015
2015/05/19 职场文书
导游词之长城八达岭
2019/09/24 职场文书
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
2021/06/21 MySQL