mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
gh-90805: Make sure test_functools works with and without _functoolsmodule (GH-108644)
This commit is contained in:
parent
57b6205523
commit
baa6dc8e38
1 changed files with 28 additions and 30 deletions
|
@ -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):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue