Consider the file below named test.py, which gives an error in mypy (though it does work correctly). Although greatly simplified here, I want to create a wrapper function that changes the default value of the function that it wraps, but otherwise passes along all kwargs to that wrapped function. I want to continue to use the TypedDict because the signature of that function may change in the future (e.g. it may someday get a d keyword argument and I don't want to update my library just because of that). Is there a good way to do this? In the actual use case, method1 has many arguments to it, so I really don't want to duplicate the signature. from typing import TypedDict, Unpack # Method1Kwargs and method1 is defined in another library class Method1Kwargs(TypedDict): a: NotRequired[int] b: NotRequired[float] c: NotRequired[str] def method1(*, a: int = 0, b: float = 10, c: str = 'c'): print(a, b, c) # in another library, we want to define method 2, which is a wrapper of method1 # except that we want to change the default value of the keyword argument "a" def method2(*, a: int = 1, **kwargs: Unpack[Method1Kwargs]): method1(a=a, **kwargs) method1() # prints: 0 10 c method2() # prints: 1 10 c method2(a=5) # prints: 5 10 c Although this works correctly, when run through mypy it generates the following error: $ mypy test.py test.py:17: error: Overlap between argument names and ** TypedDict items: "a" [misc] Found 1 error in 1 file (checked 1 source file) On option to make this work would be to define a new TypedDict that does not include the "a" argument, as shown below. But now if the signature of method1 changes (which is defined in an upstream library), I need to update Method2Kwargs to keep it in sync. from typing import NotRequired, TypedDict, Unpack class Method1Kwargs(TypedDict): a: NotRequired[int] b: NotRequired[float] c: NotRequired[str] def method1(*, a: int = 0, b: float = 10, c: str = 'c'): print(a, b, c) class Method2Kwargs(TypedDict): b: NotRequired[float] c: NotRequired[str] def method2(*, a: int = 1, **kwargs: Unpack[Method2Kwargs]): method1(a=a, **kwargs) Another option would be to not use the TypedDict at all, but this has the same issue as the previous one where the signatures can easily get out of sync (again, recall that method1 is actually in a different library). Even worse, if the default value in the base library changes (e.g. the default for "b" changes to 20), then that won't be reflected in method2. from typing import NotRequired, TypedDict def method1(*, a: int = 0, b: float = 10, c: str = 'c'): print(a, b, c) def method2(*, a: int = 1, b: float = 10, c: str = 'c'): method1(a=a, b=b, c=c) I guess what I would ideally like is a way to have a "partial" TypedDict where 1 or more arguments are dropped from it. So I could do something like def method2(*, a: int = 1, **kwargs: Unpack[Method1Kwargs,Skip[a]]): such that mypy would know that a does not actually have overlap. Surely there is some canonical way to do this, but I haven't been able to find it online or figure it out without duplicating the method1 signature. Continue reading...