typeshed icon indicating copy to clipboard operation
typeshed copied to clipboard

Cachetools timer with datetime.now

Open m3brown opened this issue 2 years ago • 1 comments

A followup to the issue presented in #6953, I'm running into mypy errors when implementing a cache using the mechanism as defined in the cachetools documentation.

Cachetools documentation for TRLUCache with example that matches the implementation below.

My implementation

def expires_in_ttu(_key, value, now):
    expires_in = value[1]
    return now + timedelta(seconds=expires_in)

cache = TLRUCache(maxsize=10, ttu=expires_in_ttu, timer=datetime.now)

The mypy error:

Argument "timer" to "TLRUCache" has incompatible type "Callable[[Optional[tzinfo]], datetime]"; expected "Callable[[], float]"

Workaround:

We can use time.monotonic instead of datetime.now, but: - the example in the docs use datetime.now - datetime.now is arguably more familiar to most developers

Versions

  • cachetools: 5.2.0
  • types-cachetools: 5.2.1

m3brown avatar Aug 01 '22 18:08 m3brown

Arguably time.monotonic() would be better for some applications, because datetime.now() can go backwards. But I agree that both should be supported.

Akuli avatar Aug 01 '22 18:08 Akuli

I've have a similar problem with the ttl variable. Maybe my own incompetance but I couldn't get my tests with freezegun working with time.monotonic. Made the switch and can write the tests no problem but currently haven't to supress lint warnings for using timedelta instead of float.

michaeljpeake avatar Apr 18 '23 11:04 michaeljpeake