全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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.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 禁止函数修改列表的实现方法  # Python列表list内建函数用法实例分析【insert、remove、index、pop等】  # Python学习教程之常用的内置函数大全  # python函数中return后的语句一定不会执行吗?  # Python正则表达式常用函数总结  # python3.4用函数操作mysql5.7数据库  # 详谈Python基础之内置函数和递归  # Python入门之三角函数tan()函数实例详解  # 回调  # 自己的  # 是在  # 我写  # 复用  # kwargs  # callback  # crawl  # url  # isinstance  # func  # getattr  # basestring  # hasattr  # def  # pre  # class  # js  # brush 


相关文章: 猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  建站之星备案流程有哪些注意事项?  Bpmn 2.0的XML文件怎么画流程图  魔毅自助建站系统:模板定制与SEO优化一键生成指南  如何登录建站主机?访问步骤全解析  如何通过老薛主机一键快速建站?  小型网站建站如何选择虚拟主机?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  建站之星安装后如何配置SEO及设计样式?  如何在Windows环境下新建FTP站点并设置权限?  C#如何使用XPathNavigator高效查询XML  小程序网站制作需要准备什么资料,如何制作小程序?  如何用腾讯建站主机快速创建免费网站?  韩国服务器如何优化跨境访问实现高效连接?  山东云建站价格为何差异显著?  已有域名如何免费搭建网站?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  如何通过FTP空间快速搭建安全高效网站?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  5种Android数据存储方式汇总  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  大型企业网站制作流程,做网站需要注册公司吗?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  如何用PHP快速搭建高效网站?分步指南  定制建站如何定义?其核心优势是什么?  如何高效搭建专业期货交易平台网站?  制作网站的基本流程,设计网站的软件是什么?  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  学校为何禁止电信移动建设网站?  宿州网站制作公司兴策,安徽省低保查询网站?  Java解压缩zip - 解压缩多个文件或文件夹实例  如何快速查询域名建站关键信息?  相册网站制作软件,图片上的网址怎么复制?  微信小程序 input输入框控件详解及实例(多种示例)  如何快速搭建支持数据库操作的智能建站平台?  如何用狗爹虚拟主机快速搭建网站?  淘宝制作网站有哪些,淘宝网官网主页?  全景视频制作网站有哪些,全景图怎么做成网页?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  c# 服务器GC和工作站GC的区别和设置  如何做网站制作流程,*游戏网站怎么搭建?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  建站主机选择指南:服务器配置与SEO优化实战技巧  高性能网站服务器配置指南:安全稳定与高效建站核心方案  如何快速建站并高效导出源代码?  如何使用Golang table-driven基准测试_多组数据测量函数效率 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。