當前位置:
首頁 > 知識 > python 自定義回調函數

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 領跌,資金出逃意願明顯