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:
Berker Peksag 2015-09-22 13:08:16 +03:00
parent 5e202086a5
commit 9b93c6b5df
2 changed files with 21 additions and 3 deletions

View File

@ -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
-------------------- --------------------

View File

@ -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):