attrs icon indicating copy to clipboard operation
attrs copied to clipboard

Typing issue (stubs) for converter with default

Open Funth0mas opened this issue 6 years ago • 1 comments

When using attr.ibute with both converter and default, wrong expectations is applied on default type (with mypy == 0.670). Mypy dev say it's an issue in attr stubs.

The valid code

import attr
import typing

def to_int(x: typing.Any) -> int:
    return int(x)

@attr.s
class C:
    a: int = attr.ib(converter=to_int, default="1")

results in:

main.py:9: error: Incompatible types in assignment (expression has type "str", variable has type "int")
main.py:9: error: Argument "converter" has incompatible type "Callable[[Any], int]"; expected "Optional[Callable[[Any], str]]"

The result is not right, because the converter is applied on default value as well.

Of course the hotfix is to convert the default value manually.

Funth0mas avatar Mar 13 '19 06:03 Funth0mas

import attr import typing

def to_int(x: typing.Any) -> int: return int(x)

@attr.s class C: a: int = attr.ib(converter=to_int, default="1") # Manually specify the default as a string a: int = attr.ib(converter=to_int, default=1) # Manually specify the default as an integer

Example usage

obj1 = C() # 'a' will have a default value of 1 as an integer obj2 = C("42") # 'a' will be converted to an integer using the converter

print(obj1.a) print(obj2.a)

ljluestc avatar Sep 20 '23 23:09 ljluestc