我需要在Python中声明一个带超时的变量!事实上,我需要像REDIS超时这样的东西,当我们试图在超时后读取密钥时,我们会得到null(None(。我知道变量可以被删除,在那之后,读取变量会引发错误,但对我来说,返回None就足够了。有没有现成的库/包可以满足这一要求,或者在没有样板代码的情况下帮助我做到这一点?
这里有一个自定义类,用于一个有超时的变量,而无需安装第三方包:
import time
class TimeoutVar:
"""Variable whose values time out."""
def __init__(self, value, timeout):
"""Store the timeout and value."""
self._value = value
self._last_set = time.time()
self.timeout = timeout
@property
def value(self):
"""Get the value if the value hasn't timed out."""
if time.time() - self._last_set < self.timeout:
return self._value
@value.setter
def value(self, value, timeout=None):
"""Set the value while resetting the timer."""
self._value = value
self._last_set = time.time()
if timeout is not None:
self.timeout = timeout
您可以将其保存在一个文件中,比如timeout_var.py
,然后在代码中导入该类。这可以如下使用:
import time
from timeout_var import TimeoutVar
var = TimeoutVar(value=3, timeout=5)
print(var.value)
time.sleep(5)
print(var.value)
var.value = 7
print(var.value)
time.sleep(5)
print(var.value)
输出为:
3
None
7
None
当为value
属性指定一个新值时,内部计时器也会重置。
尝试ExpiringDict
。它允许您定义一个带有密钥过期的字典。
首先,安装包:
pip install expiringdict
以下是一个基本用法示例:
import time
from expiringdict import ExpiringDict
vars_with_expiry = ExpiringDict(max_age_seconds=1, max_len=100)
vars_with_expiry["my_var"] = "hello"
print(vars_with_expiry.get("my_var")) # hello
time.sleep(2)
print(vars_with_expiry.get("my_var")) # None
vars_with_expiry
是一个字典,其到期超时为1秒,最大长度为100个密钥(ExpiringDict
在初始化过程中需要预定义的大小参数(。
在上面的示例中,您可以看到密钥my_var
是如何被删除的,并且在sleep
之后不可用。