Issue #25137: Add a note to whatsnew/3.5.rst for nested functools.partial calls
Also, properly skip the test_nested_optimization test for partial subclasses and add a test for the suggested usage.
This commit is contained in:
parent
5e202086a5
commit
9b93c6b5df
|
@ -2441,6 +2441,12 @@ Changes in the Python API
|
||||||
module and the :func:`help` function.
|
module and the :func:`help` function.
|
||||||
(Contributed by Serhiy Storchaka in :issue:`15582`.)
|
(Contributed by Serhiy Storchaka in :issue:`15582`.)
|
||||||
|
|
||||||
|
* Nested :func:`functools.partial` calls are now flattened. If you were
|
||||||
|
relying on the previous behavior, you can now either add an attribute to a
|
||||||
|
:func:`functools.partial` object or you can create a subclass of
|
||||||
|
:func:`functools.partial`.
|
||||||
|
(Contributed by Alexander Belopolsky in :issue:`7830`.)
|
||||||
|
|
||||||
Changes in the C API
|
Changes in the C API
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
|
|
|
@ -139,14 +139,23 @@ class TestPartial:
|
||||||
|
|
||||||
def test_nested_optimization(self):
|
def test_nested_optimization(self):
|
||||||
partial = self.partial
|
partial = self.partial
|
||||||
# Only "true" partial is optimized
|
|
||||||
if partial.__name__ != 'partial':
|
|
||||||
return
|
|
||||||
inner = partial(signature, 'asdf')
|
inner = partial(signature, 'asdf')
|
||||||
nested = partial(inner, bar=True)
|
nested = partial(inner, bar=True)
|
||||||
flat = partial(signature, 'asdf', bar=True)
|
flat = partial(signature, 'asdf', bar=True)
|
||||||
self.assertEqual(signature(nested), signature(flat))
|
self.assertEqual(signature(nested), signature(flat))
|
||||||
|
|
||||||
|
def test_nested_partial_with_attribute(self):
|
||||||
|
# see issue 25137
|
||||||
|
partial = self.partial
|
||||||
|
|
||||||
|
def foo(bar):
|
||||||
|
return bar
|
||||||
|
|
||||||
|
p = partial(foo, 'first')
|
||||||
|
p2 = partial(p, 'second')
|
||||||
|
p2.new_attr = 'spam'
|
||||||
|
self.assertEqual(p2.new_attr, 'spam')
|
||||||
|
|
||||||
|
|
||||||
@unittest.skipUnless(c_functools, 'requires the C _functools module')
|
@unittest.skipUnless(c_functools, 'requires the C _functools module')
|
||||||
class TestPartialC(TestPartial, unittest.TestCase):
|
class TestPartialC(TestPartial, unittest.TestCase):
|
||||||
|
@ -238,6 +247,9 @@ class TestPartialCSubclass(TestPartialC):
|
||||||
if c_functools:
|
if c_functools:
|
||||||
partial = PartialSubclass
|
partial = PartialSubclass
|
||||||
|
|
||||||
|
# partial subclasses are not optimized for nested calls
|
||||||
|
test_nested_optimization = None
|
||||||
|
|
||||||
|
|
||||||
class TestPartialMethod(unittest.TestCase):
|
class TestPartialMethod(unittest.TestCase):
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue