Skip to content

How should I type my validators? #524

Open
@jml

Description

@jml

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

oremanj commented on Apr 3, 2019

@oremanj
Contributor

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.

wikiped

wikiped commented on Mar 19, 2023

@wikiped

I would suggest to change the title to something like:

How to use Attribute in type annotation and fix error: 'type' object is not subscriptable

This would help pin point the problem and help find this issue / solution.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    DocumentationTypingTyping/stub/Mypy/PyRight related bugs.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      How should I type my validators? · Issue #524 · python-attrs/attrs