[3.7] bpo-33188: Allow dynamic creation of generic dataclasses (GH-6319) by miss-islington · Pull Request #6320 · python/cpython
Expand Up
@@ -8,7 +8,7 @@
import inspect
import unittest
from unittest.mock import Mock
from typing import ClassVar, Any, List, Union, Tuple, Dict, Generic, TypeVar
from typing import ClassVar, Any, List, Union, Tuple, Dict, Generic, TypeVar, Optional
from collections import deque, OrderedDict, namedtuple
from functools import total_ordering
Expand Down Expand Up @@ -1690,6 +1690,23 @@ def new_method(self): c = Alias(10, 1.0) self.assertEqual(c.new_method(), 1.0)
def test_generic_dynamic(self): T = TypeVar('T')
@dataclass class Parent(Generic[T]): x: T Child = make_dataclass('Child', [('y', T), ('z', Optional[T], None)], bases=(Parent[int], Generic[T]), namespace={'other': 42}) self.assertIs(Child[int](1, 2).z, None) self.assertEqual(Child[int](1, 2, 3).z, 3) self.assertEqual(Child[int](1, 2, 3).other, 42) # Check that type aliases work correctly. Alias = Child[T] self.assertEqual(Alias[int](1, 2).x, 1) # Check MRO resolution. self.assertEqual(Child.__mro__, (Child, Parent, Generic, object))
def test_helper_replace(self): @dataclass(frozen=True) class C: Expand Down
Expand Down Expand Up @@ -1690,6 +1690,23 @@ def new_method(self): c = Alias(10, 1.0) self.assertEqual(c.new_method(), 1.0)
def test_generic_dynamic(self): T = TypeVar('T')
@dataclass class Parent(Generic[T]): x: T Child = make_dataclass('Child', [('y', T), ('z', Optional[T], None)], bases=(Parent[int], Generic[T]), namespace={'other': 42}) self.assertIs(Child[int](1, 2).z, None) self.assertEqual(Child[int](1, 2, 3).z, 3) self.assertEqual(Child[int](1, 2, 3).other, 42) # Check that type aliases work correctly. Alias = Child[T] self.assertEqual(Alias[int](1, 2).x, 1) # Check MRO resolution. self.assertEqual(Child.__mro__, (Child, Parent, Generic, object))
def test_helper_replace(self): @dataclass(frozen=True) class C: Expand Down