Attrs: How should I type my validators?

Created on 3 Apr 2019  路  1Comment  路  Source: python-attrs/attrs

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?

Documentation Typing

Most helpful comment

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-runtime

In 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+, consider from __future__ import annotations.

>All comments

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-runtime

In 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+, consider from __future__ import annotations.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

indigoviolet picture indigoviolet  路  8Comments

Nicholas-Mitchell picture Nicholas-Mitchell  路  15Comments

2mol picture 2mol  路  5Comments

sky-code picture sky-code  路  7Comments

Tinche picture Tinche  路  15Comments