Skip to content

Commit 595c33c

Browse files
committed
Don't fail when parsing types with invalid __parameters__
1 parent 148f9a1 commit 595c33c

2 files changed

Lines changed: 26 additions & 5 deletions

File tree

msgspec/_utils.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,22 @@ def _eval_type(t, globalns, localns):
5050

5151

5252
def _apply_params(obj, mapping):
53-
if params := getattr(obj, "__parameters__", None):
54-
args = tuple(mapping.get(p, p) for p in params)
55-
return obj[args]
56-
elif isinstance(obj, typing.TypeVar):
53+
if isinstance(obj, typing.TypeVar):
5754
return mapping.get(obj, obj)
58-
return obj
55+
56+
try:
57+
parameters = tuple(obj.__parameters__)
58+
except Exception:
59+
# Not parameterized or __parameters__ is invalid, ignore
60+
return obj
61+
62+
if not parameters:
63+
# Not parametrized
64+
return obj
65+
66+
# Parametrized
67+
args = tuple(mapping.get(p, p) for p in parameters)
68+
return obj[args]
5969

6070

6171
def _get_class_mro_and_typevar_mappings(obj):

tests/test_utils.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,3 +190,14 @@ class Sub2(Sub, Base[int]):
190190
z: str
191191

192192
assert get_class_annotations(Sub2) == {"x": int, "y": float, "z": str}
193+
194+
def test_generic_invalid_parameters(self):
195+
class Invalid:
196+
@property
197+
def __parameters__(self):
198+
pass
199+
200+
class Sub(Base[Invalid]):
201+
pass
202+
203+
assert get_class_annotations(Sub) == {"x": Invalid}

0 commit comments

Comments
 (0)