On Wed, Jan 27, 2021 at 11:45 AM Daniel Moisset <dfmoisset@gmail.com> wrote:
I think that something in the proposal I sent was missed. The key of the proposal wasn't as much of "add a special value" (which it does), but mostly "use a Union[]" (I wrote it with the new | syntax, but I think this should be the same with explicit Union[Foo, Missing]. 

I stated this because the behaviour of "holes" in dictionaries already has Union semantics. Not just in the abstract sense of "there is more than one possible behaviour when evaluating mydict['mykey'] ", but in the general properties of Unions. For example consider this TypeDict declarations:

class A(TypedDict):
    x: int
    y: int|str
    z: int|Missing

class B(TypedDict):
    x: str
    z: int

 value: A|B

Currently the type of value["x"] is int|str (the union of the types for x in both types). What happens for "holes" then?

value["z"] has type int|Missing. That is the Union[int|Missing, int] which again are the types on both sides (note that we use here that Unions can be flattened and int|int == int). value["y"] is a bit more trickier, but we can consider that there's an implicit "y: Missing" in B (for every name except "x" and "z" ) so the type of value["y"] is int|str|Missing. value["doesnotexist"] has type Missing|Missing, which due to union rules, is equivalent to Missing.

Adding some special form like "Required[int|str]" will need to define what does it mean to have Union[Required[T1], T2] and similar interactions, and in the end you will end up recreating the definition and algebraic rules for a Union, because what we have conceptually here is a Union.

But Required does not add anything new. TypedDict already supports having some mandatory arguments and some that are not mandatory (by combining classes with total=False/True through inheritance).
 
--
--Guido van Rossum (python.org/~guido)