mirror of
https://github.com/python/cpython.git
synced 2025-07-24 11:44:31 +00:00
gh-117266: Fix crashes on user-created AST subclasses (GH-117276)
Fix crashes on user-created AST subclasses
This commit is contained in:
parent
8cb7d7ff86
commit
4c71d51a4b
4 changed files with 69 additions and 4 deletions
|
@ -2916,6 +2916,47 @@ class ASTConstructorTests(unittest.TestCase):
|
|||
self.assertEqual(node.name, 'foo')
|
||||
self.assertEqual(node.decorator_list, [])
|
||||
|
||||
def test_custom_subclass(self):
|
||||
class NoInit(ast.AST):
|
||||
pass
|
||||
|
||||
obj = NoInit()
|
||||
self.assertIsInstance(obj, NoInit)
|
||||
self.assertEqual(obj.__dict__, {})
|
||||
|
||||
class Fields(ast.AST):
|
||||
_fields = ('a',)
|
||||
|
||||
with self.assertWarnsRegex(DeprecationWarning,
|
||||
r"Fields provides _fields but not _field_types."):
|
||||
obj = Fields()
|
||||
with self.assertRaises(AttributeError):
|
||||
obj.a
|
||||
obj = Fields(a=1)
|
||||
self.assertEqual(obj.a, 1)
|
||||
|
||||
class FieldsAndTypes(ast.AST):
|
||||
_fields = ('a',)
|
||||
_field_types = {'a': int | None}
|
||||
a: int | None = None
|
||||
|
||||
obj = FieldsAndTypes()
|
||||
self.assertIs(obj.a, None)
|
||||
obj = FieldsAndTypes(a=1)
|
||||
self.assertEqual(obj.a, 1)
|
||||
|
||||
class FieldsAndTypesNoDefault(ast.AST):
|
||||
_fields = ('a',)
|
||||
_field_types = {'a': int}
|
||||
|
||||
with self.assertWarnsRegex(DeprecationWarning,
|
||||
r"FieldsAndTypesNoDefault\.__init__ missing 1 required positional argument: 'a'\."):
|
||||
obj = FieldsAndTypesNoDefault()
|
||||
with self.assertRaises(AttributeError):
|
||||
obj.a
|
||||
obj = FieldsAndTypesNoDefault(a=1)
|
||||
self.assertEqual(obj.a, 1)
|
||||
|
||||
|
||||
@support.cpython_only
|
||||
class ModuleStateTests(unittest.TestCase):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue