On Sun, Apr 17, 2022 at 03:22 David Foster <davidfstr@gmail.com> wrote:
One possible phrasing of this: "Extra fields are not permitted in literal assigments to TypedDicts, although at runtime they may be present in TypedDict values."
I would certainly support this clarification in documentation related to TypedDict.
In docs, sure. As a completely separate idea, it may be useful to make it easy to
extract the extra field values from a runtime value of a TypedDict, and to explicitly copy those field values to a new TypedDict instance. Consider the following:
class Point2D(TypedDict): x: int y: int
class NamedPoint2D(Point2D): name: str
n_point = NamedPoint2D(x=1, y=2, name='Center')
P = TypeVar('P', Point2D)
# Does swap the "x" and "y" components of a Point2D, # while preserving its __extra__ fields. def transpose(p: P) -> P: return Point2D( # maybe write P( here instead? x=p['y'], y=p['x'], **Point2D.__extra__(p))
transposed_n_point = transpose(n_point) print(transposed_n_point) # prints: {"x": 2, "y": 1, "name": "Center"} reveal_type(transposed_n_point) # NamedPoint2D
The above code (1) uses a new @classmethod called __extra__() on the Point2D TypedDict that extracts any fields from the provided value that are not in Point2D's definition, and (2) allows a Point2D TypedDict to be constructed with a ** splat with statically-unknown extra fields.
I’d like to see some use cases for such syntax before we go there. And why would __extra__ need to be a Point2D method?
-- --Guido (mobile)