# decorator wrapper for _Parser() def Parser(cls, cache = False): def _fun(fun): def _Fun(*arg, **kw): # try get from cache if cache and (len(arg) >= 1 or '_id' in kw): _id = arg[0] if arg else kw['_id'] o = Cacher(cls).get(_id) if o: return o ret = fun(*arg, **kw) try: ret = _Parser(ret, cls) except Exception as e: logging.exception('failed to parse') return ret return _Fun return _fun
主要是为了对函数的返回值做解析并缓存
大概是这样用的
@Parser(Type, True) def get_type(_id): ...
现在脑袋有点晕
![]() | 1 ligyxy 2015-07-27 21:26:09 +08:00 via Android 看看PEP上的例子就不晕了 |
2 gtv 2015-07-27 21:32:01 +08:00 len(arg) >= 1 可以优化为 if len? |
3 gtv 2015-07-27 21:32:37 +08:00 说错了 if arg |
![]() | 4 gamexg 2015-07-27 22:12:11 +08:00 via Android 昨天也写了一个,也是缓存,不过我是在第二个函数内生成的cahce。 Python3 标准库自带了一个 |
5 julyclyde 2015-07-27 22:39:50 +08:00 没看懂调用方法…… Parser返回_fun,用_fun(cls)代替原cls? |
![]() | 6 hitsmaxft 2015-07-27 23:08:11 +08:00 via iPhone 足以见得python不支持匿名函数这个语法糖,非要偷懒用局部函数定义,是多么大的损失。 |
![]() | 7 DeanThompson 2015-07-27 23:11:47 +08:00 @julyclyde 这是 Python 的装饰器(decorator)语法,可以看看这里: http://stackoverflow.com/questions/739654/how-can-i-make-a-chain-of-function-decorators-in-python#answer-1594484 |
8 julyclyde 2015-07-27 23:13:13 +08:00 @DeanThompson 我知道是decorator,但没见过这么厚的……想象力不够用了 |
![]() | 9 bcxx 2015-07-27 23:13:50 +08:00 这种写法应该用 class 来代替的…… 重载 __call__ 方法就好了…… 另外建议看看 pep8 ~,~ |
![]() | 10 fatpa 2015-07-28 01:34:58 +08:00 不就是一装饰器么…………………… |
![]() | 11 ffffwh 2015-07-28 09:33:31 +08:00 快去lambda神教洗洗脑 |
![]() | 12 ryd994 2015-07-28 10:18:05 +08:00 via Android 外面两层可以lambda |
![]() | 13 yueyoum 2015-07-28 12:50:36 +08:00 1, PEP8 2, 多学学基础知识 |