Open
Description
I'm trying to add some types to some attrs-using code that uses validators.
Here's a minimal example of such:
from typing import Any, TypeVar
from attr import Attribute
T = TypeVar("T")
def my_validator(instance: Any, attribute: Attribute[T], value: T) -> Any:
pass
The type is derived by looking at attr/validators.pyi
and attr/__init__.pyi
.
The code type-checks fine, but fails to execute:
jml@hope:~
$ mypy --strict attribute.py
jml@hope:~
$ python attribute.py
Traceback (most recent call last):
File "attribute.py", line 8, in <module>
def my_validator(instance: Any, attribute: Attribute[T], value: T) -> Any:
TypeError: 'type' object is not subscriptable
If I remove the [T]
, the opposite happens:
jml@hope:~
$ mypy --strict attribute.py
attribute.py:8: error: Missing type parameters for generic type
jml@hope:~
$ python attribute.py
What type should my validators have?
Activity
oremanj commentedon Apr 3, 2019
Looks like
Attribute
is generic in the stubs but not in the runtime code. This isn't an issue that's unique to attrs, and there's an entry about it in the mypy manual: https://mypy.readthedocs.io/en/latest/common_issues.html#using-classes-that-are-generic-in-stubs-but-not-at-runtimeIn this case the easiest fix is probably to escape the type hint by writing it in quotes:
attribute: "Attribute[T]"
. Or if you're on 3.7+, considerfrom __future__ import annotations
.wikiped commentedon Mar 19, 2023
I would suggest to change the title to something like:
How to use
Attribute
in type annotation and fix error: 'type' object is not subscriptableThis would help pin point the problem and help find this issue / solution.