import weakref
import types
+from test.support import import_helper
from test import mod_generics_cache
from test import _typed_dict_helper
+py_typing = import_helper.import_fresh_module('typing', blocked=['_typing'])
+c_typing = import_helper.import_fresh_module('typing', fresh=['_typing'])
+
+
class BaseTestCase(TestCase):
def assertIsSubclass(self, cls, class_or_tuple, msg=None):
assert foo(None) is None
-class NewTypeTests(BaseTestCase):
+class TestModules(TestCase):
+ func_names = ['_idfunc']
+
+ def test_py_functions(self):
+ for fname in self.func_names:
+ self.assertEqual(getattr(py_typing, fname).__module__, 'typing')
+
+ @skipUnless(c_typing, 'requires _typing')
+ def test_c_functions(self):
+ for fname in self.func_names:
+ self.assertEqual(getattr(c_typing, fname).__module__, '_typing')
+
+
+class NewTypeTests:
+ def setUp(self):
+ sys.modules['typing'] = self.module
+
+ def tearDown(self):
+ sys.modules['typing'] = typing
def test_basic(self):
- UserId = NewType('UserId', int)
- UserName = NewType('UserName', str)
+ UserId = self.module.NewType('UserId', int)
+ UserName = self.module.NewType('UserName', str)
self.assertIsInstance(UserId(5), int)
self.assertIsInstance(UserName('Joe'), str)
self.assertEqual(UserId(5) + 1, 6)
def test_errors(self):
- UserId = NewType('UserId', int)
- UserName = NewType('UserName', str)
+ UserId = self.module.NewType('UserId', int)
+ UserName = self.module.NewType('UserName', str)
with self.assertRaises(TypeError):
issubclass(UserId, int)
with self.assertRaises(TypeError):
pass
def test_or(self):
- UserId = NewType('UserId', int)
- UserName = NewType('UserName', str)
+ UserId = self.module.NewType('UserId', int)
+ UserName = self.module.NewType('UserName', str)
for cls in (int, UserName):
with self.subTest(cls=cls):
- self.assertEqual(UserId | cls, Union[UserId, cls])
- self.assertEqual(cls | UserId, Union[cls, UserId])
+ self.assertEqual(UserId | cls, self.module.Union[UserId, cls])
+ self.assertEqual(cls | UserId, self.module.Union[cls, UserId])
- self.assertEqual(get_args(UserId | cls), (UserId, cls))
- self.assertEqual(get_args(cls | UserId), (cls, UserId))
+ self.assertEqual(self.module.get_args(UserId | cls), (UserId, cls))
+ self.assertEqual(self.module.get_args(cls | UserId), (cls, UserId))
def test_special_attrs(self):
- UserId = NewType('UserId', int)
+ UserId = self.module.NewType('UserId', int)
self.assertEqual(UserId.__name__, 'UserId')
self.assertEqual(UserId.__qualname__, 'UserId')
self.assertEqual(UserId.__module__, __name__)
def test_repr(self):
- UserId = NewType('UserId', int)
+ UserId = self.module.NewType('UserId', int)
self.assertEqual(repr(UserId), f'{__name__}.UserId')
+class NewTypePythonTests(BaseTestCase, NewTypeTests):
+ module = py_typing
+
+
+@skipUnless(c_typing, 'requires _typing')
+class NewTypeCTests(BaseTestCase, NewTypeTests):
+ module = c_typing
+
+
class NamedTupleTests(BaseTestCase):
class NestedEmployee(NamedTuple):
name: str
--- /dev/null
+/* typing accelerator C extension: _typing module. */
+
+#include "Python.h"
+#include "clinic/_typingmodule.c.h"
+
+/*[clinic input]
+module _typing
+
+[clinic start generated code]*/
+/*[clinic end generated code: output=da39a3ee5e6b4b0d input=1db35baf1c72942b]*/
+
+/* helper function to make typing.NewType.__call__ method faster */
+
+/*[clinic input]
+_typing._idfunc -> object
+
+ x: object
+ /
+
+[clinic start generated code]*/
+
+static PyObject *
+_typing__idfunc(PyObject *module, PyObject *x)
+/*[clinic end generated code: output=63c38be4a6ec5f2c input=49f17284b43de451]*/
+{
+ Py_INCREF(x);
+ return x;
+}
+
+
+static PyMethodDef typing_methods[] = {
+ _TYPING__IDFUNC_METHODDEF
+ {NULL, NULL, 0, NULL}
+};
+
+PyDoc_STRVAR(typing_doc,
+"Accelerators for the typing module.\n");
+
+static struct PyModuleDef_Slot _typingmodule_slots[] = {
+ {0, NULL}
+};
+
+static struct PyModuleDef typingmodule = {
+ PyModuleDef_HEAD_INIT,
+ "_typing",
+ typing_doc,
+ 0,
+ typing_methods,
+ _typingmodule_slots,
+ NULL,
+ NULL,
+ NULL
+};
+
+PyMODINIT_FUNC
+PyInit__typing(void)
+{
+ return PyModuleDef_Init(&typingmodule);
+}
extern PyObject* PyInit__sha512(void);
extern PyObject* PyInit__sha3(void);
extern PyObject* PyInit__statistics(void);
+extern PyObject* PyInit__typing(void);
extern PyObject* PyInit__blake2(void);
extern PyObject* PyInit_time(void);
extern PyObject* PyInit__thread(void);
{"_blake2", PyInit__blake2},
{"time", PyInit_time},
{"_thread", PyInit__thread},
+ {"_typing", PyInit__typing},
{"_statistics", PyInit__statistics},
#ifdef WIN32
{"msvcrt", PyInit_msvcrt},