summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorNikita Sobolev <mail@sobolevn.me>2023-09-11 16:13:37 (GMT)
committerGitHub <noreply@github.com>2023-09-11 16:13:37 (GMT)
commitbaa6dc8e388e71b2a00347143ecefb2ad3a8e53b (patch)
tree875ff271fba13b42c54b05a57bad896bdd514c05 /Lib/test
parent57b6205523d934d61b6308d63ef72c494c7d2b7e (diff)
downloadcpython-baa6dc8e388e71b2a00347143ecefb2ad3a8e53b.zip
cpython-baa6dc8e388e71b2a00347143ecefb2ad3a8e53b.tar.gz
cpython-baa6dc8e388e71b2a00347143ecefb2ad3a8e53b.tar.bz2
gh-90805: Make sure test_functools works with and without _functoolsmodule (GH-108644)
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_functools.py58
1 files changed, 28 insertions, 30 deletions
diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py
index 5ba7f51..e4de2c5 100644
--- a/Lib/test/test_functools.py
+++ b/Lib/test/test_functools.py
@@ -26,10 +26,16 @@ import functools
py_functools = import_helper.import_fresh_module('functools',
blocked=['_functools'])
-c_functools = import_helper.import_fresh_module('functools')
+c_functools = import_helper.import_fresh_module('functools',
+ fresh=['_functools'])
decimal = import_helper.import_fresh_module('decimal', fresh=['_decimal'])
+_partial_types = [py_functools.partial]
+if c_functools:
+ _partial_types.append(c_functools.partial)
+
+
@contextlib.contextmanager
def replaced_module(name, replacement):
original_module = sys.modules[name]
@@ -201,7 +207,7 @@ class TestPartial:
kwargs = {'a': object(), 'b': object()}
kwargs_reprs = ['a={a!r}, b={b!r}'.format_map(kwargs),
'b={b!r}, a={a!r}'.format_map(kwargs)]
- if self.partial in (c_functools.partial, py_functools.partial):
+ if self.partial in _partial_types:
name = 'functools.partial'
else:
name = self.partial.__name__
@@ -223,7 +229,7 @@ class TestPartial:
for kwargs_repr in kwargs_reprs])
def test_recursive_repr(self):
- if self.partial in (c_functools.partial, py_functools.partial):
+ if self.partial in _partial_types:
name = 'functools.partial'
else:
name = self.partial.__name__
@@ -250,7 +256,7 @@ class TestPartial:
f.__setstate__((capture, (), {}, {}))
def test_pickle(self):
- with self.AllowPickle():
+ with replaced_module('functools', self.module):
f = self.partial(signature, ['asdf'], bar=[True])
f.attr = []
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
@@ -333,7 +339,7 @@ class TestPartial:
self.assertIs(type(r[0]), tuple)
def test_recursive_pickle(self):
- with self.AllowPickle():
+ with replaced_module('functools', self.module):
f = self.partial(capture)
f.__setstate__((f, (), {}, {}))
try:
@@ -387,14 +393,9 @@ class TestPartial:
@unittest.skipUnless(c_functools, 'requires the C _functools module')
class TestPartialC(TestPartial, unittest.TestCase):
if c_functools:
+ module = c_functools
partial = c_functools.partial
- class AllowPickle:
- def __enter__(self):
- return self
- def __exit__(self, type, value, tb):
- return False
-
def test_attributes_unwritable(self):
# attributes should not be writable
p = self.partial(capture, 1, 2, a=10, b=20)
@@ -437,15 +438,9 @@ class TestPartialC(TestPartial, unittest.TestCase):
class TestPartialPy(TestPartial, unittest.TestCase):
+ module = py_functools
partial = py_functools.partial
- class AllowPickle:
- def __init__(self):
- self._cm = replaced_module("functools", py_functools)
- def __enter__(self):
- return self._cm.__enter__()
- def __exit__(self, type, value, tb):
- return self._cm.__exit__(type, value, tb)
if c_functools:
class CPartialSubclass(c_functools.partial):
@@ -1872,9 +1867,10 @@ class TestLRU:
def py_cached_func(x, y):
return 3 * x + y
-@c_functools.lru_cache()
-def c_cached_func(x, y):
- return 3 * x + y
+if c_functools:
+ @c_functools.lru_cache()
+ def c_cached_func(x, y):
+ return 3 * x + y
class TestLRUPy(TestLRU, unittest.TestCase):
@@ -1891,18 +1887,20 @@ class TestLRUPy(TestLRU, unittest.TestCase):
return 3 * x + y
+@unittest.skipUnless(c_functools, 'requires the C _functools module')
class TestLRUC(TestLRU, unittest.TestCase):
- module = c_functools
- cached_func = c_cached_func,
+ if c_functools:
+ module = c_functools
+ cached_func = c_cached_func,
- @module.lru_cache()
- def cached_meth(self, x, y):
- return 3 * x + y
+ @module.lru_cache()
+ def cached_meth(self, x, y):
+ return 3 * x + y
- @staticmethod
- @module.lru_cache()
- def cached_staticmeth(x, y):
- return 3 * x + y
+ @staticmethod
+ @module.lru_cache()
+ def cached_staticmeth(x, y):
+ return 3 * x + y
class TestSingleDispatch(unittest.TestCase):