Skip to content

Optional strict checking of *args and/or multiple assignment #7408

Open
@JukkaL

Description

@JukkaL

Currently mypy does optimistic checking of *args -- we don't generate error if it could be valid. This seems like a reasonable default, since it avoids false positive errors. However, some users might prefer stricter checking as an option. When this option is enabled, mypy would only allow variable-length (non-Any) *args in a call if the callee also accepts *args.

Example:

def f(a: int) -> None: pass

x = [1, 2]
f(*x)  # Currently accepted, since mypy doesn't know the length of x

PR #7392 relaxed the rules so that we assume that any list *args argument could be empty and thus we don't complain about even if a caller *args argument is only valid when it's empty.

Similarly this option (or a similar option) could reject variable-length rvalues in multiple assignment like this:

x = [1, 2]
a, b, c = x  # Currently accepted

If we'd have support for enabling/disabling specific error codes, these checks could easily be implemented through error codes that are disabled by default.

Refactoring code such as the above (if correct) to pass mypy could be somewhat painful, however. It could be written like this:

def f(a: int, b: int) -> None: pass

def g(x: List[int]) -> None:
    assert len(x) == 2
    f(x[0], x[1])

(Of course, a # type: ignore would also work.)

Activity

ilevkivskyi

ilevkivskyi commented on Aug 29, 2019

@ilevkivskyi
Member

I agree this may be useful, but I would say it is relatively low priority (as compared to similar issues like annotating **kwargs with a TypedDict).

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

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      Optional strict checking of *args and/or multiple assignment · Issue #7408 · python/mypy