在运行Python脚本的内部设置过期不起作用

在运行Python脚本的内部设置过期不起作用,python,process,queue,set,Python,Process,Queue,Set,我有一个叫做DecayingSet的类,它是一个过期的deque 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, th

我有一个叫做DecayingSet的类,它是一个过期的deque

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返回我试图放在deque中的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,每次指示url不在集合中时,l都返回True,而这应该在集合中。给出了什么?

复制我的评论;-)我认为缩进是错误的,但是每次调用
on\u status()
时,看起来您都在创建一个全新的
limit
对象。当然,它总是会返回
True
:您总是从一个空的
限制开始

无论如何,请更改以下内容:

     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
对象。剪切并粘贴;-)

我认为缩进是错误的,但是每次调用
on\u status()
时,看起来您都在创建一个全新的
limit
对象。当然,它总是返回
True
:您总是以一个空的
限制开始。这是实际的代码吗?上面有一个奇怪的缩进,我认为Python会被它卡住。是的,我在qs中的缩进是关闭的,在代码中很好。是的!!我刚刚在解释器中看到var赋值是罪魁祸首。如何使用相同的obj?例如,您可以在模块级别创建
limit
对象。如果没有你所有的代码,我就不能说得更具体。但这应该非常容易;-)像往常一样,这是我一直忽略的一件简单的事情。但是比较从何而来,当返回true或false时,代码如何知道该做什么?这是默认行为HEH-阅读
if
语句的文档<代码>如果:
执行
当且仅当
的计算结果为“truthy”值时。没有什么比
True
更真实的了,也没有什么比
False
更真实的了比较与此无关!比较只是写“真实”表达的一种方式。谢谢@蒂姆·彼得斯。真是默认值,这是真的!!这就是如果他在寻找真相。在别处创建限制对象。我把limit=DecayingSet(86400)移到了类/函数之外!现在它作为广告工作,但在回答中,我接受它…“在别处创建限制对象”我发现了我的设计中的一个缺陷。如果重新启动脚本,将创建一个新的obj实例,从而允许重复项进入。无论如何,要使集合在脚本重置期间保持不变。Memcache可能是一种方法,或者有没有办法将集合保存到磁盘,然后即使在重新启动时也继续检查该对象。去研究泡菜,搁置,然后推。。。我走对了吗?