回调函数用起来比较爽。特别是在js中,满世界全是回调,那么在python中,怎么来优雅地实现自己的回调函数呢
下面贴一个我写的例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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可以改写成装饰器方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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) |
原文链接:http://www.cnblogs.com/alexkn/p/7051193.html