mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
bpo-43916: Add Py_TPFLAGS_DISALLOW_INSTANTIATION type flag (GH-25721)
Add a new Py_TPFLAGS_DISALLOW_INSTANTIATION type flag to disallow creating type instances: set tp_new to NULL and don't create the "__new__" key in the type dictionary. The flag is set automatically on static types if tp_base is NULL or &PyBaseObject_Type and tp_new is NULL. Use the flag on the following types: * _curses.ncurses_version type * _curses_panel.panel * _tkinter.Tcl_Obj * _tkinter.tkapp * _tkinter.tktimertoken * _xxsubinterpretersmodule.ChannelID * sys.flags type * sys.getwindowsversion() type * sys.version_info type Update MyStr example in the C API documentation to use Py_TPFLAGS_DISALLOW_INSTANTIATION. Add _PyStructSequence_InitType() function to create a structseq type with the Py_TPFLAGS_DISALLOW_INSTANTIATION flag set. type_new() calls _PyType_CheckConsistency() at exit.
This commit is contained in:
parent
b73b5fb9ea
commit
3bb09947ec
13 changed files with 144 additions and 102 deletions
|
@ -605,11 +605,12 @@ class SysModuleTest(unittest.TestCase):
|
|||
def assert_raise_on_new_sys_type(self, sys_attr):
|
||||
# Users are intentionally prevented from creating new instances of
|
||||
# sys.flags, sys.version_info, and sys.getwindowsversion.
|
||||
arg = sys_attr
|
||||
attr_type = type(sys_attr)
|
||||
with self.assertRaises(TypeError):
|
||||
attr_type()
|
||||
attr_type(arg)
|
||||
with self.assertRaises(TypeError):
|
||||
attr_type.__new__(attr_type)
|
||||
attr_type.__new__(attr_type, arg)
|
||||
|
||||
def test_sys_flags_no_instantiation(self):
|
||||
self.assert_raise_on_new_sys_type(sys.flags)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue