0

我有一个名为 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 不在集合内,什么时候应该在。是什么赋予了?

4

1 回答 1

1

复制我的评论 ;-) 我认为缩进搞砸了,但看起来你limit每次on_status()调用时都在创建一个全新的对象。然后当然它总是会返回True:你总是从一个空的limit.

无论如何,改变这个:

     l = limit.add(longUrl)
     print l
     if l == False:
        pass
     else:
        r = requests.get("http://api.some.url/show?url=%s"% longUrl)

对此:

     if limit.add(longUrl):
        r = requests.get("http://api.some.url/show?url=%s"% longUrl)

更容易遵循。通常情况下,当您将某些内容与文字True或进行比较时False,可以使代码更具可读性。

编辑

我刚刚在解释器中看到 var 分配是罪魁祸首。我将如何使用相同的 obj?

例如,您可以limit在模块级别创建对象。剪切和粘贴 ;-)

于 2013-10-31T04:28:21.267 回答