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
在這裡實現的是當self.crawl指定callback方法時,self.crawl會在接收到start_url參數執行完成後回調self.index_url。
而實現方式其實就是通過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):
"""在self.crawl(url,callback=$func)時,通過裝飾器callback即可實現回調,在self.crawl方法中,只需要專註於得到$func的參數即可"""
@callback
def crawl(self, url, **kwargs):
url = quote_chinese(_build_url(url.strip, kwargs.get("params")))
return requests.get(url)


※遞歸和分治思想及其應用
※mysql分析sql語句基礎工具——explain
※JMS 之 Active MQ 消息存儲
TAG:達人科技 |
※callback Promise async await 非同步回調 案例
※徹底理解 Node.js 中的回調(Callback)函數
※解決 nodejs callback無限嵌套(回調地獄)問題
※CT、MR圖像存儲與回調——toshiba篇
※Robert Shiller:亮眼的財報季也無法阻止下一次回調
※Coinness分析:BTC回調力度減緩 收於$8652以上繼續看漲
※軟網推薦:找回調整Windows 10字型大小功能
※野村證券下調Twitter評級 預期過高或致股價回調近30%
※妖姬回調,Faker把血條變消失的妖姬又回來了,不過EDG和Pawn不見了!
※LOL:妖姬改動全部回調到舊版,adc的噩夢回來了
※新大龍buff太恐怖回調 炮車分分鐘拆掉高地
※EOS、BCH佔領跌幅榜,垂直鏈上漲猛略回調
※九合創投王嘯:AI公司估值或回調,To TMD 或成新退出機制
※回調函數理解
※主流幣回調反襯EOS強勢 BTC多空決戰8680
※LOL4月6日PBE更新:刀妹緊急爆削,光輝所有改動回調!
※興業投資:OPEC增產擔憂籠罩 原油進一步回調
※LOL 9.16版本更新:妖姬回調辛德拉增強,AD還有活路嗎
※DNF:泰波爾斯與漩渦血量回調 回調到韓服150%那麼多呢
※主流幣回調,EOS 領跌,資金出逃意願明顯