From 3d956dff53d27f05bd84a5afb261b97de97fffc3 Mon Sep 17 00:00:00 2001 From: Oleh Prypin Date: Thu, 15 Jan 2026 04:45:44 -0800 Subject: [PATCH] Prepare for Python 3.13: replace `classmethod(AutoConfig(...))` with a new dedicated `AutoConfigClassMethod` descriptor. This is necessary because Python 3.13 no longer recognizes descriptor chaining: https://github.com/python/cpython/pull/110163 PiperOrigin-RevId: 856608179 --- fiddle/_src/experimental/auto_config.py | 19 +++++++++++++++++++ fiddle/_src/tagging.py | 6 +++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/fiddle/_src/experimental/auto_config.py b/fiddle/_src/experimental/auto_config.py index b25bb573..2d7df69d 100644 --- a/fiddle/_src/experimental/auto_config.py +++ b/fiddle/_src/experimental/auto_config.py @@ -61,6 +61,25 @@ _GenericCallable = TypeVar('_GenericCallable', bound=Callable[..., Any]) +@dataclasses.dataclass(frozen=True) +class AutoConfigClassMethod: + """A wrapper for auto_config'd class methods.""" + + func: Callable[..., Any] + always_inline: bool + + def __get__(self, obj, objtype=None): + return AutoConfig( + func=types.MethodType(self.func, objtype), + buildable_func=types.MethodType(self.func, objtype), + always_inline=self.always_inline, + ) + + @property + def __wrapped__(self): + return self.func + + @dataclasses.dataclass(frozen=True) class AutoConfig: """A function wrapper for auto_config'd functions. diff --git a/fiddle/_src/tagging.py b/fiddle/_src/tagging.py index 6b2e020b..05688ce7 100644 --- a/fiddle/_src/tagging.py +++ b/fiddle/_src/tagging.py @@ -107,9 +107,9 @@ def new(cls, default: Any = NO_VALUE) -> Any: return TaggedValue(tags=(cls,), default=default) if not typing.TYPE_CHECKING: - new = classmethod( - auto_config.AutoConfig( - func=new.__func__, buildable_func=new.__func__, always_inline=True)) + new = auto_config.AutoConfigClassMethod( + func=new.__func__, always_inline=True + ) T = TypeVar('T')