Kaydet (Commit) 01ee12ba authored tarafından Augusto Hack's avatar Augusto Hack Kaydeden (comit) Eric V. Smith

bpo-33569 Preserve type information with dataclasses.InitVar (GH-8927)

üst 00253502
......@@ -201,10 +201,16 @@ _MODULE_IDENTIFIER_RE = re.compile(r'^(?:\s*(\w+)\s*\.)?\s*(\w+)')
class _InitVarMeta(type):
def __getitem__(self, params):
return self
return InitVar(params)
class InitVar(metaclass=_InitVarMeta):
pass
__slots__ = ('type', )
def __init__(self, type):
self.type = type
def __repr__(self):
return f'dataclasses.InitVar[{self.type.__name__}]'
# Instances of Field are only ever created from within this module,
......@@ -586,7 +592,8 @@ def _is_classvar(a_type, typing):
def _is_initvar(a_type, dataclasses):
# The module we're checking against is the module we're
# currently in (dataclasses.py).
return a_type is dataclasses.InitVar
return (a_type is dataclasses.InitVar
or type(a_type) is dataclasses.InitVar)
def _is_type(annotation, cls, a_module, a_type, is_type_predicate):
......
......@@ -1097,6 +1097,12 @@ class TestCase(unittest.TestCase):
c = C(init_param=10)
self.assertEqual(c.x, 20)
def test_init_var_preserve_type(self):
self.assertEqual(InitVar[int].type, int)
# Make sure the repr is correct.
self.assertEqual(repr(InitVar[int]), 'dataclasses.InitVar[int]')
def test_init_var_inheritance(self):
# Note that this deliberately tests that a dataclass need not
# have a __post_init__ function if it has an InitVar field.
......
dataclasses.InitVar: Exposes the type used to create the init var.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment