attrs: mypy/typing false positives

Using attrs 6e7b9f2 and mypy 0.720:


from typing import List, Dict, Any, Union, Optional
import attr


@attr.s
class Foo:
    # OK
    str_list: List[str] = attr.ib(
        validator=attr.validators.deep_iterable(
            attr.validators.instance_of(str), attr.validators.instance_of(list)
        )
    )
    # Incompatible types in assignment (expression has type "Optional[List[_T]]", variable has type "Optional[List[str]]")
    maybe_str_list: Optional[List[str]] = attr.ib(
        validator=attr.validators.optional(
            attr.validators.deep_iterable(
                attr.validators.instance_of(str), attr.validators.instance_of(list)
            )
        )
    )
    # OK
    str_dict: Dict[str, Any] = attr.ib(
        validator=attr.validators.deep_mapping(
            attr.validators.instance_of(str),
            attr.validators.instance_of(object),
            attr.validators.instance_of(dict),
        )
    )
    # OK
    maybe_str_dict: Optional[Dict[str, Any]] = attr.ib(
        validator=attr.validators.optional(
            attr.validators.deep_mapping(
                attr.validators.instance_of(str),
                attr.validators.instance_of(object),
                attr.validators.instance_of(dict),
            )
        )
    )
    # Argument 1 to "instance_of" has incompatible type "Tuple[Type[str], Type[int]]"; expected "Union[Tuple[Type[<nothing>], ...], Type[<nothing>]]"
    str_int: Union[str, int] = attr.ib(
        validator=attr.validators.instance_of((str, int))
    )
    # (the error is shown twice for some reason)
    # Argument 1 to "instance_of" has incompatible type "Tuple[Type[str], Type[int]]"; expected "Union[Tuple[Type[<nothing>], ...], Type[<nothing>]]"
    # Argument 1 to "instance_of" has incompatible type "Tuple[Type[str], Type[int]]"; expected "Union[Tuple[Type[None], ...], Type[None]]"
    maybe_str_int: Optional[Union[str, int]] = attr.ib(
        validator=attr.validators.optional(attr.validators.instance_of((str, int)))
    )

deep_iterable seems to have an issue when combined with optional, instance_of doesn’t like tuples of types.

About this issue

  • Original URL
  • State: closed
  • Created 5 years ago
  • Comments: 16 (13 by maintainers)

Commits related to this issue

Most upvoted comments

finally got around to update my library and can confirm these typing issues went away. thank you all for your hard work.

As soon as #580 is merged. Dunno when someone finds time for review. ¯\_(ツ)_/¯

ran into this, and attrs master fixes the instance_of being given a tuple.