Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 529c74d

Browse files
committed
Public constructor for TypeAlias
1 parent 92c29e7 commit 529c74d

7 files changed

Lines changed: 146 additions & 6 deletions

Include/internal/pycore_global_objects_fini_generated.h

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Include/internal/pycore_global_strings.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -716,6 +716,7 @@ struct _Py_global_strings {
716716
STRUCT_FOR_ID(twice)
717717
STRUCT_FOR_ID(txt)
718718
STRUCT_FOR_ID(type)
719+
STRUCT_FOR_ID(type_params)
719720
STRUCT_FOR_ID(tz)
720721
STRUCT_FOR_ID(tzname)
721722
STRUCT_FOR_ID(uid)

Include/internal/pycore_runtime_init_generated.h

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Include/internal/pycore_unicodeobject_generated.h

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Lib/test/test_type_aliases.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import unittest
33
from test.support import check_syntax_error
44

5-
from typing import Callable, TypeAliasType, get_args
5+
from typing import Callable, TypeAliasType, TypeVar, get_args
66

77
from .test_type_params import run_code
88

@@ -149,3 +149,34 @@ def test_recursive_repr(self):
149149
type X = list[Y]
150150
type Y = list[X]
151151
self.assertEqual(repr(X), "X")
152+
153+
154+
class TypeAliasConstructorTest(unittest.TestCase):
155+
def test_basic(self):
156+
TA = TypeAliasType("TA", int)
157+
self.assertEqual(TA.__name__, "TA")
158+
self.assertIs(TA.__value__, int)
159+
self.assertEqual(TA.__type_params__, ())
160+
161+
def test_generic(self):
162+
T = TypeVar("T")
163+
TA = TypeAliasType("TA", list[T], type_params=(T,))
164+
self.assertEqual(TA.__name__, "TA")
165+
self.assertEqual(TA.__value__, list[T])
166+
self.assertEqual(TA.__type_params__, (T,))
167+
168+
def test_keywords(self):
169+
TA = TypeAliasType(name="TA", value=int)
170+
self.assertEqual(TA.__name__, "TA")
171+
self.assertIs(TA.__value__, int)
172+
self.assertEqual(TA.__type_params__, ())
173+
174+
def test_errors(self):
175+
with self.assertRaises(TypeError):
176+
TypeAliasType()
177+
with self.assertRaises(TypeError):
178+
TypeAliasType("TA")
179+
with self.assertRaises(TypeError):
180+
TypeAliasType("TA", list, ())
181+
with self.assertRaises(TypeError):
182+
TypeAliasType("TA", list, type_params=42)

Objects/clinic/typevarobject.c.h

Lines changed: 77 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Objects/typevarobject.c

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1333,7 +1333,8 @@ static PyGetSetDef typealias_getset[] = {
13331333
};
13341334

13351335
static typealiasobject *
1336-
typealias_alloc(const char *name, PyObject *type_params, PyObject *compute_value)
1336+
typealias_alloc(const char *name, PyObject *type_params, PyObject *compute_value,
1337+
PyObject *value)
13371338
{
13381339
char *owned_name = strdup(name);
13391340
if (owned_name == NULL) {
@@ -1348,8 +1349,8 @@ typealias_alloc(const char *name, PyObject *type_params, PyObject *compute_value
13481349
}
13491350
ta->name = owned_name;
13501351
ta->type_params = Py_IsNone(type_params) ? NULL : Py_XNewRef(type_params);
1351-
ta->compute_value = Py_NewRef(compute_value);
1352-
ta->value = NULL;
1352+
ta->compute_value = Py_XNewRef(compute_value);
1353+
ta->value = Py_XNewRef(value);
13531354
_PyObject_GC_TRACK(ta);
13541355
return ta;
13551356
}
@@ -1400,6 +1401,31 @@ static PyMethodDef typealias_methods[] = {
14001401
{0}
14011402
};
14021403

1404+
1405+
/*[clinic input]
1406+
@classmethod
1407+
typealias.__new__ as typealias_new
1408+
1409+
name: str
1410+
value: object
1411+
*
1412+
type_params: object = NULL
1413+
1414+
Create a TypeAliasType.
1415+
[clinic start generated code]*/
1416+
1417+
static PyObject *
1418+
typealias_new_impl(PyTypeObject *type, const char *name, PyObject *value,
1419+
PyObject *type_params)
1420+
/*[clinic end generated code: output=a49732e3a327545c input=fe542c90292dbd35]*/
1421+
{
1422+
if (type_params != NULL && !PyTuple_Check(type_params)) {
1423+
PyErr_SetString(PyExc_TypeError, "type_params must be a tuple");
1424+
return NULL;
1425+
}
1426+
return (PyObject *)typealias_alloc(name, type_params, NULL, value);
1427+
}
1428+
14031429
PyDoc_STRVAR(typealias_doc,
14041430
"Type alias.\n\
14051431
\n\
@@ -1416,6 +1442,7 @@ static PyType_Slot typealias_slots[] = {
14161442
{Py_mp_subscript, typealias_subscript},
14171443
{Py_tp_dealloc, typealias_dealloc},
14181444
{Py_tp_alloc, PyType_GenericAlloc},
1445+
{Py_tp_new, typealias_new},
14191446
{Py_tp_free, PyObject_GC_Del},
14201447
{Py_tp_traverse, (traverseproc)typealias_traverse},
14211448
{Py_tp_clear, (inquiry)typealias_clear},
@@ -1444,7 +1471,7 @@ _Py_make_typealias(PyThreadState* unused, PyObject *args)
14441471
}
14451472
PyObject *type_params = PyTuple_GET_ITEM(args, 1);
14461473
PyObject *compute_value = PyTuple_GET_ITEM(args, 2);
1447-
return (PyObject *)typealias_alloc(name_str, type_params, compute_value);
1474+
return (PyObject *)typealias_alloc(name_str, type_params, compute_value, NULL);
14481475
}
14491476

14501477
PyDoc_STRVAR(generic_doc,

0 commit comments

Comments
 (0)