【发布时间】:2013-10-31 04:17:17
【问题描述】:
我有一个名为 DecayingSet 的类,它是一个过期的双端队列
class DecayingSet:
def __init__(self, timeout): # timeout in seconds
from collections import deque
self.timeout = timeout
self.d = deque()
self.present = set()
def add(self, thing):
# Return True if `thing` not already in set,
# else return False.
result = thing not in self.present
if result:
self.present.add(thing)
self.d.append((time(), thing))
self.clean()
return result
def clean(self):
# forget stuff added >= `timeout` seconds ago
now = time()
d = self.d
while d and now - d[0][0] >= self.timeout:
_, thing = d.popleft()
self.present.remove(thing)
我正在尝试在连接到流式 API 的运行脚本中使用它。 流 api 正在返回我试图放在双端队列中的 url,以限制它们进入程序的下一步。
class CustomStreamListener(tweepy.StreamListener):
def on_status(self, status, include_entities=True):
longUrl = status.entities['urls'][0]['expanded_url']
limit = DecayingSet(86400)
l = limit.add(longUrl)
print l
if l == False:
pass
else:
r = requests.get("http://api.some.url/show?url=%s"% longUrl)
当我在解释器中使用这个类时,一切都很好。 但是当脚本运行时,我重复发送相同的 url,l 每次返回 True 表示该 url 不在集合内,什么时候应该在。什么给了?
【问题讨论】:
-
我认为缩进搞砸了,但它看起来每次调用
on_status()时,您都在创建一个全新的limit对象。那么当然它总是会返回True:你总是会从一个空的limit开始。 -
这是实际代码吗?上面有一个奇怪的缩进,我认为 Python 会窒息。
-
是的,我在 qs 中的缩进是关闭的,它在代码中很好。是的!!我刚刚在解释器中看到 var 分配是罪魁祸首。我将如何使用相同的 obj?
-
例如,您可以在模块级别创建
limit对象。如果没有 all 您的代码可供查看,我无法更具体。但这应该很容易;-) -
一如既往,这是我错过的简单事情。