如何将dict与时间戳进行比较

时间:2020-04-19 20:00:39

标签: python dictionary for-loop compare

因此,我试图制作一个字典,其中将监视您所监视的每个产品,当有库存进货时,它将检查该字典并查看其中是否有该商品,如果没有,它将添加它。添加后,它将放入每个要补充库存的尺寸以及每个尺寸的时间戳。下次运行时,如果重新存储某些东西,它将采用这些大小并检查它们是否在字典中,如果是,则将当前时间戳与字典中的时间戳进行比较。基本上按尺寸放置冷却时间。

到目前为止,我已经做了一个演示:

import random
import sys
import time
import re
from datetime import timedelta, datetime


def randomNumber():
    payload = {
        "sizes": {}
    }
    numbers = {}
    for x in range(10):
        numbers.update({f'US {random.randint(1, 10)}': datetime.now()})

    payload['sizes'] = numbers

    return payload


def demo():
    firstList = randomNumber()

    while True:
        secondList = randomNumber()

        if len(secondList['sizes']) > len(firstList['sizes']):  # Not sure if this is needed but couldn't get another other ideas here to compare

            restockSizes = []
            restocked = False
            for key, value in secondList['sizes'].items():
                if key in firstList['sizes'].keys():
                    timenow = datetime.now()
                    elapsed = timenow - value

                    if elapsed > timedelta(seconds=5):
                        restockSizes.append(f'{key}')
                        restocked = True
                    else:
                        restockSizes.append(f'{key}')
                        time.sleep(random.randint(1, 3))

            if restocked:
                print(f'Restocked: {restockSizes}')
                firstList = secondList

        else:
            print("No restock.")
            firstList = secondList

demo()

我不确定它是否确实按照我的描述工作。至于现在,我感到有些不清楚,是什么原因让我firstList = secondList

如果我必须在firstList和secondList之间进行比较,还不确定我是否也需要else statement

希望有人能看到这些缺陷并帮助我!

可以说我们的增量为分钟= 5

第一个请求:

美国3:22:23,美国4:22:23,美国5 22:23

第二个请求(第一次请求后1分钟):

US 3:22:23,US 4:22:23,US 5 22:23, US 6:22:24,US 8:22:24

第三次请求(第一次请求后5分钟):

美国3:22:28,美国4:22:28,美国5 22:28 ,美国6:22:24,美国8:22:24

第四次请求(第一次请求后6分钟):

US 3:22:28,US 4:22:28,US 5 22:28, US 6:22:29,US 8:22:29

1 个答案:

答案 0 :(得分:1)

我认为这表明了您所寻找的一般想法:

from datetime import datetime, timedelta
import random
from typing import Dict, List


class RequestFilter:
    """Tracks requests and filters them to prevent hammering."""

    def __init__(self, cooldown: timedelta):
        self._cooldown = cooldown
        self._requests: Dict[str, datetime] = {}

    def filter(self, requests: List[str], time: datetime) -> List[str]:
        """Filter requests to only those that haven't been made
        previously within our defined cooldown period."""
        # Get filtered set of requests.
        filtered = [
            r for r in list(set(requests))
            if (
                r not in self._requests
                or time - self._requests[r] >= self._cooldown
            )
        ]
        # Refresh timestamps for requests we're actually making.
        for r in filtered:
            self._requests[r] = time
        return filtered


if __name__ == '__main__':
    time = datetime.now()
    request_filter = RequestFilter(timedelta(minutes=5))
    for _ in range(100):
        requests = [
            f"US {random.randint(1, 10)}"
            for _ in range(5)
        ]
        print(request_filter.filter(requests, time), time)
        time += timedelta(minutes=1)

请注意,我使过滤功能带有时间戳,而不是在内部实际使用datetime.now() -这样,您可以使用伪造的时间戳对其进行单元测试,而不必修补datetime或它实际上在假请求之间睡了一分钟。 :)

在现实生活中,您只需要说request_filter.filter(requests, datetime.now())就可以实时使用它。或者,您可以将其用作__main__函数:

if __name__ == '__main__':
    from time import sleep
    request_filter = RequestFilter(timedelta(minutes=5))
    for _ in range(100):
        requests = [
            f"US {random.randint(1, 10)}"
            for _ in range(5)
        ]
        print(request_filter.filter(requests, datetime.now()), datetime.now())
        sleep(60)