Python中优雅实现自定义回调函数的两种方案
本文详解Python中实现自定义回调函数的两种优雅方式。首先通过kwargs接收回调标识,利用getattr进行反射调用;其次进一步抽象为装饰器模式,封装URL请求与回调逻辑,提升代码复用性与可维护性。
回调函数的使用体验通常较为顺畅。特别是在JavaScript开发中,回调机制无处不在。那么在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)
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













