这个是装饰器类。
class PostCache:
def __init__(self, func):
self.func = func
self.redis = redis.StrictRedis()
def __call__(self, url_list):
url_not_cached = []
for url in url_list:
if self.redis.get(url):
self.redis.expire(url, 600)
else:
url_not_cached.append(url)
self.redis.set(url, '1')
self.redis.expire(url, 600)
return self.func(url_not_cached)
这个是要被装饰的方法。
@rediscache.PostCache
def __get_content_list(self, url_list):
content_list = []
for url in url_list:
content_list.append(self.get_content(url))
time.sleep(config_intervaltime())
return content_list
然后报错
File "crawler.py", line 28, in get_posts
post_content_list = self.__get_content_list(url_list)
TypeError: __call__() missing 1 required positional argument: 'url_list'
该如何解决呢?
1
kinghui 2016-01-27 15:25:50 +08:00
|
2
bobuick 2016-01-27 15:27:36 +08:00 1
你需要确保它实现了 __call__() 和 __get__() 方法
|
3
kinghui 2016-01-27 15:28:10 +08:00
看错了, 请忽略我
|
4
KIDJourney OP @bobuick 为什么要实现__get__()呢?
[PythonDecoratorLibrary]( https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize) |
5
KIDJourney OP @bobuick 看到了,多谢了。
|
6
KIDJourney OP @bobuick 还是不太明白。。我再去看一下。
|
7
julyclyde 2016-01-27 20:51:39 +08:00
同问,为什么__get__()
关注 |
8
phithon 2016-01-27 22:46:37 +08:00 1
|
9
KIDJourney OP @phithon 多谢了。
|