Skip to content

Commit 1a11bf9

Browse files
Adjust tests for the new PyCapsule_Import() behavior
A submodule not imported by its package is now imported if needed. Errors raised during importing the module or looking up an attribute are now propagated instead of being replaced with generic ImportError or AttributeError. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 148d4c9 commit 1a11bf9

1 file changed

Lines changed: 27 additions & 34 deletions

File tree

Lib/test/test_capi/test_capsule.py

Lines changed: 27 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -93,49 +93,46 @@ def test_non_ascii_module_name(self):
9393
self.check_import(f'{name}.capsule')
9494

9595
def test_submodule(self):
96-
# Only the first component is imported; a submodule not imported
97-
# by its package is not found.
98-
self.assertRaises(AttributeError,
99-
_testlimitedcapi.PyCapsule_Import, 'capsule_pkg.sub.capsule')
100-
# It is found after explicit import.
101-
importlib.import_module('capsule_pkg.sub')
96+
# A submodule not imported by its package is imported if needed.
97+
self.assertNotIn('capsule_pkg.sub', sys.modules)
98+
self.check_import('capsule_pkg.sub.capsule')
99+
self.assertIn('capsule_pkg.sub', sys.modules)
100+
# It is also found if already imported.
102101
self.check_import('capsule_pkg.sub.capsule')
103102
# A submodule imported by its package is found.
104103
self.check_import('capsule_autopkg.sub.capsule')
105104

106105
def test_invalid_name(self):
107106
pycapsule_import = _testlimitedcapi.PyCapsule_Import
108107
# Non-existing module.
109-
self.assertRaisesRegex(ImportError,
110-
'PyCapsule_Import could not import module "capsule_nonexistent"',
108+
self.assertRaisesRegex(ModuleNotFoundError,
109+
"No module named 'capsule_nonexistent'",
111110
pycapsule_import, 'capsule_nonexistent.capsule')
112111
# Non-UTF-8 module name.
113-
self.assertRaisesRegex(ImportError,
114-
'PyCapsule_Import could not import module',
115-
pycapsule_import, b'\xff\xfe.capsule')
112+
self.assertRaises(UnicodeDecodeError,
113+
pycapsule_import, b'\xff\xfe.capsule')
116114
# Empty module name.
117-
self.assertRaisesRegex(ImportError,
118-
'PyCapsule_Import could not import module ""',
119-
pycapsule_import, '.capsule_mod.capsule')
115+
self.assertRaisesRegex(ValueError, 'Empty module name',
116+
pycapsule_import, '.capsule_mod.capsule')
120117
# Empty name.
121-
self.assertRaisesRegex(ImportError,
122-
'PyCapsule_Import could not import module ""',
123-
pycapsule_import, '')
118+
self.assertRaisesRegex(AttributeError, 'is not valid',
119+
pycapsule_import, '')
124120
# Only a dot.
125-
self.assertRaisesRegex(ImportError,
126-
'PyCapsule_Import could not import module ""',
127-
pycapsule_import, '.')
121+
self.assertRaisesRegex(ValueError, 'Empty module name',
122+
pycapsule_import, '.')
128123
# Non-existing attribute.
129-
self.assertRaises(AttributeError,
130-
pycapsule_import, 'capsule_mod.nonexistent')
124+
self.assertRaisesRegex(AttributeError, 'is not valid',
125+
pycapsule_import, 'capsule_mod.nonexistent')
131126
# Empty attribute name.
132-
self.assertRaises(AttributeError, pycapsule_import, 'capsule_mod.')
127+
self.assertRaisesRegex(AttributeError, 'is not valid',
128+
pycapsule_import, 'capsule_mod.')
133129
# Consecutive dots.
134-
self.assertRaises(AttributeError,
135-
pycapsule_import, 'capsule_mod..capsule')
130+
self.assertRaisesRegex(ModuleNotFoundError,
131+
"No module named 'capsule_mod.'",
132+
pycapsule_import, 'capsule_mod..capsule')
136133
# Attribute of an object which is not a module.
137-
self.assertRaises(AttributeError,
138-
pycapsule_import, 'capsule_mod.not_capsule.capsule')
134+
self.assertRaisesRegex(AttributeError, 'is not valid',
135+
pycapsule_import, 'capsule_mod.not_capsule.capsule')
139136
# No attribute name.
140137
self.assertRaisesRegex(AttributeError, 'is not valid',
141138
pycapsule_import, 'capsule_mod')
@@ -162,13 +159,9 @@ def test_invalid_capsule(self):
162159
pycapsule_import, 'capsule_mod.nullname')
163160

164161
def test_error_from_import(self):
165-
# The exception raised during importing the module is replaced
166-
# with generic ImportError.
167-
with self.assertRaises(ImportError) as cm:
168-
_testlimitedcapi.PyCapsule_Import('capsule_broken.capsule')
169-
self.assertEqual(str(cm.exception),
170-
'PyCapsule_Import could not import '
171-
'module "capsule_broken"')
162+
# The exception raised during importing the module is propagated.
163+
self.assertRaises(ZeroDivisionError,
164+
_testlimitedcapi.PyCapsule_Import, 'capsule_broken.capsule')
172165

173166
def test_error_from_attribute_lookup(self):
174167
self.assertRaises(FloatingPointError,

0 commit comments

Comments
 (0)