pypi msgspec 0.22.0
Version 0.22.0

5 hours ago

Version 0.22.0 (2026-09-29)

  • BREAKING: Setting gc=False on a struct type that has a weakref slot,
    whether from weakref=True or from a base class, now raises ValueError.
    On CPython 3.12 and later the weakref slot is stored in a pre-header in
    front of the instance, so releasing an instance of a gc=False type with
    that slot corrupted memory, in most builds crashing the interpreter
    outright. The combination worked on 3.10 and 3.11, and the restriction
    applies there as well, so that the same class definition behaves the same
    way on every supported version (#1207).
  • Add frozendict support on Python 3.15+ (#1052, #1105).
  • Support passing a callable as decimal_format to msgspec.json.Encoder and
    msgspec.msgpack.Encoder for custom Decimal encoding (#978).
  • Support Literal[True] and Literal[False] types (#1004).
  • Publish CPython 3.15 wheels, including freethreaded builds (#1152).
  • Publish Linux riscv64 wheels (#987).
  • Support the PyEmscripten (Pyodide) platform (#1083).
  • Fix handling of PEP 695 type parameter syntax (class Foo[T]) and of
    types.GenericAlias instances in type annotations (#962).
  • Fix NameError when creating a Struct with an unquoted forward
    reference on Python 3.14 (#1165).
  • Fix a crash on incorrect typing.ClassVar annotations (#1097).
  • Fix an AttributeError when converting to a Struct type defined in a
    namespace without a __name__ (#1072).
  • Fix overriding an inherited field alias back to the field's own name
    (#1133).
  • Raise ValidationError instead of SystemError when convert receives an
    out-of-range int for a float target (#1162).
  • Report raw rather than the misleading any as the expected type when a
    non-Raw value is given for a Raw field in convert, and therefore in
    yaml.decode and toml.decode (#1169).
  • Fix an empty expected-type name in validation errors for a required Raw
    field in a TypedDict, or a Raw field with a default_factory on a
    dataclass or an attrs class (#1176).
  • Correct the error messages for out-of-range Meta length bounds
    (#1172).
  • Fix a reference leak when decoding msgpack Ext payloads (#1109).
  • Fix backing type declaration of Ext.code (#1135).
  • Fix a reference leak in msgspec.to_builtins, and therefore in
    yaml.encode, for array_like=True structs (#1177).
  • Fix reference leaks in typenode_collect_literal, Meta.__rich_repr__,
    ms_decode_bigint, and Encoder.__init__ (#1021, #1022,
    #1023, #1040).
  • Fix msgspec.inspect.type_info and msgspec.json.schema crashing on mixed-type Literals such as Literal[1, None] (#1080).
  • Place null last in the anyOf generated for optional unions in JSON
    schemas (#1028).
  • Fix minItems in the JSON schema for array_like=True structs whose fields
    are all optional (#1124).
  • Use [] or "" rather than a Python set or bytearray object as the
    JSON schema default for Struct fields with a set or bytearray
    default_factory (#1183).
  • Preserve JSON Schema metadata and string constraints in propertyNames for
    annotated dictionary key types (#866).
  • Fix msgspec.json.encode raising TypeError for a dict keyed by a plain
    enum.Enum with str values (#1118).
  • Fix missing GC traversal and clearing of some module state members (#1060).
  • Ensure an exception is always set on allocation failures (#1044).
  • Fix compilation warnings on Python 3.15 (#1077).
  • Report the leading argument of the encode and decode functions and
    methods as positional-only in inspect.signature and the rendered docs,
    matching runtime behavior (#1116).
  • Add overloads to the Meta type stub, so type checkers reject mixing gt
    with ge or lt with le (#700).
  • Many type stub improvements and fixes (#1014, #1043, #1053,
    #1055, #1057, #1062, #1063, #1064, #1065,
    #1074, #1093, #1114, #1116, #1163, #1173,
    #1179).
  • Document the differences between msgspec.structs.asdict/astuple and
    msgspec.to_builtins (#1025).
  • Document that omit_defaults ignores fields with a custom
    default_factory (#1076).
  • Fix the msgspec.json.decode docstring to say dec_hook should raise
    NotImplementedError for unsupported types, not TypeError (#774).
  • msgspec moved to the msgspec GitHub organization;
    documentation now lives at msgspec.dev (repository
    references updated in #1045).

New Contributors

Full Changelog: 0.21.1...0.22.0

Don't miss a new msgspec release

NewReleases is sending notifications on new releases.