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 相关文章推荐
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
Oct 18 Python
在python3环境下的Django中使用MySQL数据库的实例
Aug 29 Python
python3 中文乱码与默认编码格式设定方法
Oct 31 Python
django模板加载静态文件的方法步骤
Mar 01 Python
pymongo中group by的操作方法教程
Mar 22 Python
Python 3.8新特征之asyncio REPL
May 28 Python
pytorch中的自定义反向传播,求导实例
Jan 06 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
Jan 10 Python
python实现超级马里奥
Mar 18 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
May 26 Python
python多线程semaphore实现线程数控制的示例
Aug 10 Python
Pandas数据结构之Series的使用
Mar 31 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
关于时间计算的结总
2006/12/06 PHP
PHP中函数内引用全局变量的方法
2008/10/20 PHP
php结合ACCESS的跨库查询功能
2015/06/12 PHP
PHP读取配置文件类实例(可读取ini,yaml,xml等)
2015/07/28 PHP
SESSION存放在数据库用法实例
2015/08/08 PHP
在Yii2中使用Pjax导致Yii2内联脚本载入失败的原因分析
2016/03/06 PHP
CI框架(CodeIgniter)操作redis的方法详解
2018/01/25 PHP
Javascript 中文字符串处理额外注意事项
2009/11/15 Javascript
JS中confirm,alert,prompt函数使用区别分析
2010/04/01 Javascript
Javascript中Event属性搜集整理
2013/09/17 Javascript
document.write的几点使用心得
2014/05/14 Javascript
node.js中的dns.getServers方法使用说明
2014/12/08 Javascript
jQuery模拟新浪微博首页滚动效果的方法
2015/03/11 Javascript
jquery控制页面的展开和隐藏实现方法(推荐)
2016/10/15 Javascript
以BootStrap Tab为例写一个前端组件
2017/07/25 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
深入浅析javascript函数中with
2018/10/28 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
JavaScript实现拖拽盒子效果
2020/02/06 Javascript
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
python微信跳一跳系列之自动计算跳一跳距离
2018/02/26 Python
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
Django shell调试models输出的SQL语句方法
2019/08/29 Python
python中for循环变量作用域及用法详解
2019/11/05 Python
django框架ModelForm组件用法详解
2019/12/11 Python
基于python实现检索标记敏感词并输出
2020/05/07 Python
python3读取autocad图形文件.py实例
2020/06/05 Python
汉森批发:Hansen Wholesale
2018/05/24 全球购物
办公文员的工作岗位职责
2013/11/12 职场文书
工商企业管理实习自我鉴定
2013/12/04 职场文书
医药个人求职信范文
2014/01/29 职场文书
《口技》教学反思
2014/02/21 职场文书
教师节横幅标语
2014/10/08 职场文书
python实现简单反弹球游戏
2021/04/12 Python
关于python类SortedList详解
2021/09/04 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
2022/04/07 Python