Skip to content

collect_by_mro is missing in the typed signature #711

Closed
@raabf

Description

@raabf

Although the parameter collect_by_mro is implemented in

attrs/src/attr/_make.py

Lines 994 to 1017 in 48157a5

def attrs(
maybe_cls=None,
these=None,
repr_ns=None,
repr=None,
cmp=None,
hash=None,
init=None,
slots=False,
frozen=False,
weakref_slot=True,
str=False,
auto_attribs=False,
kw_only=False,
cache_hash=False,
auto_exc=False,
eq=None,
order=None,
auto_detect=False,
collect_by_mro=False,
getstate_setstate=None,
on_setattr=None,
field_transformer=None,
):

it is missing it the typed signature of the pyi file

attrs/src/attr/__init__.pyi

Lines 257 to 303 in 48157a5

def attrs(
maybe_cls: _C,
these: Optional[Dict[str, Any]] = ...,
repr_ns: Optional[str] = ...,
repr: bool = ...,
cmp: Optional[bool] = ...,
hash: Optional[bool] = ...,
init: bool = ...,
slots: bool = ...,
frozen: bool = ...,
weakref_slot: bool = ...,
str: bool = ...,
auto_attribs: bool = ...,
kw_only: bool = ...,
cache_hash: bool = ...,
auto_exc: bool = ...,
eq: Optional[bool] = ...,
order: Optional[bool] = ...,
auto_detect: bool = ...,
getstate_setstate: Optional[bool] = ...,
on_setattr: Optional[_OnSetAttrArgType] = ...,
field_transformer: Optional[_FieldTransformer] = ...,
) -> _C: ...
@overload
def attrs(
maybe_cls: None = ...,
these: Optional[Dict[str, Any]] = ...,
repr_ns: Optional[str] = ...,
repr: bool = ...,
cmp: Optional[bool] = ...,
hash: Optional[bool] = ...,
init: bool = ...,
slots: bool = ...,
frozen: bool = ...,
weakref_slot: bool = ...,
str: bool = ...,
auto_attribs: bool = ...,
kw_only: bool = ...,
cache_hash: bool = ...,
auto_exc: bool = ...,
eq: Optional[bool] = ...,
order: Optional[bool] = ...,
auto_detect: bool = ...,
getstate_setstate: Optional[bool] = ...,
on_setattr: Optional[_OnSetAttrArgType] = ...,
field_transformer: Optional[_FieldTransformer] = ...,
) -> Callable[[_C], _C]: ...

As a consequence, type checkers such as mypy would never allow to use collect_by_mro, since the signature cannot match, although in runtime it would work because the actual implementation of the function has the parameter.

Activity

hynek

hynek commented on Nov 3, 2020

@hynek
Member

Thanks, should be fixed.

raabf

raabf commented on Nov 3, 2020

@raabf
Author

Thank you @hynek 😄, but didn’t you miss the type annotation?
i.e. collect_by_mro: bool = ..., instead of collect_by_mro = ...,?

hynek

hynek commented on Nov 3, 2020

@hynek
Member

Waaat. Why does the test pass then. 🤔 Probably implicit Any?

hynek

hynek commented on Nov 3, 2020

@hynek
Member

Should be fixed now. Thanks for double-checking!

raabf

raabf commented on Nov 3, 2020

@raabf
Author

Thanks! Regarding the test which passes:
I did not find any mypy configuration for the attrs repository. The think the default configuration of mypy allows untyped elements, and just checks those which are typed. To detect such errors like missing types, you should make mypy more restrictive such as with disallow_untyped_defs = True and check_untyped_defs = True, which I think is good when you want to be serious regarding full compatibility with mypy.

hynek

hynek commented on Nov 4, 2020

@hynek
Member

You're right, that's how I run my own projects too. attrs's typing setup is a bit more special but this we should add. See 6b4a1f1

added a commit that references this issue on Nov 6, 2020
added a commit that references this issue on Sep 13, 2024
56c7308
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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @hynek@raabf

        Issue actions

          collect_by_mro is missing in the typed signature · Issue #711 · python-attrs/attrs