Skip to content

typing.Annotated fails for functions returning UUIDs #115165

Description

@dave-shawley

Bug report

Bug description:

typing.Annotated tries to set an attribute on the return value of calling an annotated callable. This fails when the returned object is immutable. I believe that adding TypeError to the except clause in typing. _BaseGenericAlias.__call__ will fix the problem. I'm not sure if there are more cases of the same pattern or not.

cpython/Lib/typing.py

Lines 1128 to 1131 in 17689e3

try:
result.__orig_class__ = self
except AttributeError:
pass

Example

import typing
import uuid

class MyAnnotation:
    def __init__(self, **properties) -> None:
        self.properties = properties

def uuid_from_str(s: str) -> uuid.UUID:
    return uuid.UUID(f'urn:uuid:{s}')

coercion = typing.Annotated[uuid_from_str, MyAnnotation(type='str', format='uuid')]
coercion('00000000-0000-0000-0000-000000000000')

Result

Traceback (most recent call last):
  File "/Users/.../foo.py", line 12, in <module>
    coercion('00000000-0000-0000-0000-000000000000')
  File "/Users/.../lib/python3.12/typing.py", line 1142, in __call__
    result.__orig_class__ = self
    ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/.../lib/python3.12/uuid.py", line 278, in __setattr__
    raise TypeError('UUID objects are immutable')
TypeError: UUID objects are immutable

CPython versions tested on:

3.9, 3.10, 3.11, 3.12

Operating systems tested on:

macOS

Linked PRs

Activity

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

    stdlibStandard Library Python modules in the Lib/ directorytopic-typingtype-bugAn unexpected behavior, bug, or error

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions