Description
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 commentedon Aug 29, 2019
I agree this may be useful, but I would say it is relatively low priority (as compared to similar issues like annotating
**kwargs
with aTypedDict
).