Skip to content

lru_cache annotation doesn't work as a property #5858

Closed
@takeda

Description

@takeda

So I originally reported it in typeshed/#2659 but was told this can't be fixed there and it is mypy limitation so repporting it here.


I have following code:

#! /usr/bin/env python

import time
from functools import lru_cache

class MyClass:
	@property
	@lru_cache(1)
	def expensive_operation(self) -> int:
		time.sleep(2)
		return 42

	def another_operation(self) -> int:
		return self.expensive_operation + 1

if __name__ == '__main__':
	o = MyClass()
	print(o.expensive_operation)
	print(o.expensive_operation)
	print(o.another_operation())

It works as expected:

$ ./test.py
42
42
43

Yet, mypy is showing errors:

$ mypy test.py
test.py:7: error: Decorated property not supported
test.py:14: error: Unsupported operand types for + ("_lru_cache_wrapper[int]" and "int")

The lru_cache works just fine when decorated as property, and the returned type should be int and not _lru_cache_wrapper[int].

This is on python 3.7.0 and mypy 0.641.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugmypy got something wrongtopic-descriptorsProperties, class vs. instance attributes

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions