diff options
Diffstat (limited to 'Lib/functools.py')
| -rw-r--r-- | Lib/functools.py | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/Lib/functools.py b/Lib/functools.py index a51dddf..c8b79c2 100644 --- a/Lib/functools.py +++ b/Lib/functools.py @@ -793,7 +793,23 @@ def singledispatch(func): """ nonlocal cache_token if func is None: - return lambda f: register(cls, f) + if isinstance(cls, type): + return lambda f: register(cls, f) + ann = getattr(cls, '__annotations__', {}) + if not ann: + raise TypeError( + f"Invalid first argument to `register()`: {cls!r}. " + f"Use either `@register(some_class)` or plain `@register` " + f"on an annotated function." + ) + func = cls + + # only import typing if annotation parsing is necessary + from typing import get_type_hints + argname, cls = next(iter(get_type_hints(func).items())) + assert isinstance(cls, type), ( + f"Invalid annotation for {argname!r}. {cls!r} is not a class." + ) registry[cls] = func if cache_token is None and hasattr(cls, '__abstractmethods__'): cache_token = get_cache_token() |
