typeshed icon indicating copy to clipboard operation
typeshed copied to clipboard

PEP 692 (kwargs TypedDict) tracker

Open hmc-cs-mdrissi opened this issue 1 year ago • 4 comments

Test example I'm using for support,

from typing import TypedDict

from typing_extensions import Unpack


class Foo(TypedDict, total=False):
    a: int
    b: str


def f(**kwargs: Unpack[Foo]) -> None:
    ...


f(a=1, b="2")  # OK
f(a=1, b=2)  # Error: b has type str
f(a=1, b="2", c=3)  # Error: unexpected keyword argument "c"
  • [x] mypy
  • [x] pyright
  • [ ] pytype
  • [ ] pyre
  • [ ] PyCharm (nice to have, but not required): Open ticket.

pytype and pyre both produce 1 error on f(**kwargs: Unpack[Foo]) . Pytype produces typing_extensions.Unpack not supported yet [not-supported-yet] while pyre produces pep_692.py:11:16 Undefined or invalid type [11]: Annotation Unpack is not defined as a type.

Unsure if typeshed usage for this should wait til pyre/pytype fully support pep 692 or if current status of them not checking lines reliant on 692 is enough (similar to Self type status). pytype/pyre still detect errors normally for other parts of the file.

For mypy side we would also need to adjust line with mypy flags to include --enable-incomplete-feature=Unpack (maybe other incomplete features should be considered too).

Motivation for issue was yesterday I hit some lines in tensorflow stub where 692 would be helpful. Minor though and being explicit on arguments works fine (just adds a couple stubtest allowlist lines).

hmc-cs-mdrissi avatar Feb 11 '23 07:02 hmc-cs-mdrissi

Thanks for opening this! What would be the effect if someone uses a stub with mypy that uses this feature without --enable-incomplete-feature? Will it be treated as Any or will there be an error? In the latter case we can't use the feature, the former case would be acceptable in my opinion.

srittau avatar Feb 13 '23 12:02 srittau

Since --enable-incomplete-feature is meant for experimental features that may not work properly yet, I think we shouldn't write typeshed stubs that rely on it. But on the mypy side, maybe we can move this aspect of Unpack out of "incomplete" status, since it's a lot simpler to implement than full PEP 646 support.

JelleZijlstra avatar Feb 13 '23 14:02 JelleZijlstra

What would be the effect if someone uses a stub with mypy that uses this feature without --enable-incomplete-feature?

Here is what mypy reports:

from typing import TypedDict
from typing_extensions import Unpack

class Foo(TypedDict, total=False):
    a: int
    b: str

def f(**kwargs: Unpack[Foo]) -> None:  # E: "Unpack" support is experimental, use --enable-incomplete-feature=Unpack to enable  [misc]
    reveal_type(kwargs)  # N: Revealed type is "builtins.dict[builtins.str, Any]"

reveal_type(f)  # N: Revealed type is "def (**kwargs: Any)"

# (no error in any of the following)
f(a=1, b="2")
f(a=1, b=2)
f(a=1, b="2", c=3)

tmke8 avatar Feb 13 '23 14:02 tmke8

Sounds reasonable to wait for mypy to enable it by default. I can open up a mypy issue later today.

hmc-cs-mdrissi avatar Feb 13 '23 17:02 hmc-cs-mdrissi