Skip to content

Cannot set min_length for optional string filed #804

Closed

Description

@RoTorEx

Description

Error while creating an object with optional filed with min_length meta.

from typing import Annotated

import msgspec


class Author(msgspec.Struct):
    name: Annotated[str, msgspec.Meta(min_length=1)]
    biography: Annotated[None | str, msgspec.Meta(min_length=10)]


element = {"name": "Me", "biography": None}

author = msgspec.convert(element, type=Author)

Traceback (most recent call last):
File "", line 198, in _run_module_as_main
File "", line 88, in _run_code
File "/path/report.py", line 13, in
author = msgspec.convert(element, type=Author)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: Can only set min_length on a str, bytes, or collection type - type typing.Annotated[None | str, msgspec.Meta(min_length=10)] is invalid


msgspec version 0.19.0

Activity

  1. oek1ng commented on Jan 24, 2025

    @oek1ng

    None does not have a length, is that an issue? Try to use Annonated[str, msgspec.Meta(min_length=10)] | None

  2. Siyet commented on Apr 8, 2026

    @Siyet
    Contributor

    Resolved in the community fork msgspec-arise: issue #4, released in v0.20.2.

  3. jcrist commented on Apr 8, 2026

    @jcrist
    Member

    Not supporting this was intentional.

    We only support applying annotations directly to the type they apply to for clarity.

    # This works, and makes it clear that the annotation applies to the `int`
    Annotated[int, Meta(ge=1)] | None
    
    # This doesn't work, but IMO it shouldn't. None isn't numeric and can't support >=
    Annotated[int | None, Meta(ge=1)]
    

    Since Optional[int] is the same as int | None, it's a slippery slope to applying annotations to a union and expecting them to apply to all union members. Annotated[int | str | None, Meta(ge=1)] for example. I'd rather just keep things simple and clear - annotations must be applied to the type directly, and not the union.

  4. added a commit that references this issue on Apr 9, 2026
    b59564d
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions