mirror of https://github.com/python/cpython
gh-118895: Call PyType_Ready() on typing.NoDefault (#118897)
This commit is contained in:
parent
c444362c6e
commit
13d7cf997b
|
@ -18,6 +18,7 @@ extern int _Py_initialize_generic(PyInterpreterState *);
|
||||||
extern void _Py_clear_generic_types(PyInterpreterState *);
|
extern void _Py_clear_generic_types(PyInterpreterState *);
|
||||||
|
|
||||||
extern PyTypeObject _PyTypeAlias_Type;
|
extern PyTypeObject _PyTypeAlias_Type;
|
||||||
|
extern PyTypeObject _PyNoDefault_Type;
|
||||||
extern PyObject _Py_NoDefaultStruct;
|
extern PyObject _Py_NoDefaultStruct;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -45,7 +45,7 @@ import typing
|
||||||
import weakref
|
import weakref
|
||||||
import types
|
import types
|
||||||
|
|
||||||
from test.support import captured_stderr, cpython_only, infinite_recursion
|
from test.support import captured_stderr, cpython_only, infinite_recursion, requires_docstrings
|
||||||
from test.typinganndata import ann_module695, mod_generics_cache, _typed_dict_helper
|
from test.typinganndata import ann_module695, mod_generics_cache, _typed_dict_helper
|
||||||
|
|
||||||
|
|
||||||
|
@ -10236,15 +10236,34 @@ class NoDefaultTests(BaseTestCase):
|
||||||
def test_constructor(self):
|
def test_constructor(self):
|
||||||
self.assertIs(NoDefault, type(NoDefault)())
|
self.assertIs(NoDefault, type(NoDefault)())
|
||||||
with self.assertRaises(TypeError):
|
with self.assertRaises(TypeError):
|
||||||
NoDefault(1)
|
type(NoDefault)(1)
|
||||||
|
|
||||||
def test_repr(self):
|
def test_repr(self):
|
||||||
self.assertEqual(repr(NoDefault), 'typing.NoDefault')
|
self.assertEqual(repr(NoDefault), 'typing.NoDefault')
|
||||||
|
|
||||||
|
@requires_docstrings
|
||||||
|
def test_doc(self):
|
||||||
|
self.assertIsInstance(NoDefault.__doc__, str)
|
||||||
|
|
||||||
|
def test_class(self):
|
||||||
|
self.assertIs(NoDefault.__class__, type(NoDefault))
|
||||||
|
|
||||||
def test_no_call(self):
|
def test_no_call(self):
|
||||||
with self.assertRaises(TypeError):
|
with self.assertRaises(TypeError):
|
||||||
NoDefault()
|
NoDefault()
|
||||||
|
|
||||||
|
def test_no_attributes(self):
|
||||||
|
with self.assertRaises(AttributeError):
|
||||||
|
NoDefault.foo = 3
|
||||||
|
with self.assertRaises(AttributeError):
|
||||||
|
NoDefault.foo
|
||||||
|
|
||||||
|
# TypeError is consistent with the behavior of NoneType
|
||||||
|
with self.assertRaises(TypeError):
|
||||||
|
type(NoDefault).foo = 3
|
||||||
|
with self.assertRaises(AttributeError):
|
||||||
|
type(NoDefault).foo
|
||||||
|
|
||||||
|
|
||||||
class AllTests(BaseTestCase):
|
class AllTests(BaseTestCase):
|
||||||
"""Tests for __all__."""
|
"""Tests for __all__."""
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Setting attributes on :data:`typing.NoDefault` now raises
|
||||||
|
:exc:`AttributeError` instead of :exc:`TypeError`.
|
|
@ -63,6 +63,9 @@ _typing_exec(PyObject *m)
|
||||||
if (PyModule_AddObjectRef(m, "TypeAliasType", (PyObject *)&_PyTypeAlias_Type) < 0) {
|
if (PyModule_AddObjectRef(m, "TypeAliasType", (PyObject *)&_PyTypeAlias_Type) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (PyType_Ready(&_PyNoDefault_Type) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
if (PyModule_AddObjectRef(m, "NoDefault", (PyObject *)&_Py_NoDefaultStruct) < 0) {
|
if (PyModule_AddObjectRef(m, "NoDefault", (PyObject *)&_Py_NoDefaultStruct) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue