在运行Python脚本的内部设置过期不起作用
我有一个叫做DecayingSet的类,它是一个过期的deque在运行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
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可能是一种方法,或者有没有办法将集合保存到磁盘,然后即使在重新启动时也继续检查该对象。去研究泡菜,搁置,然后推。。。我走对了吗?