Title: Deepcopy of functools.partial gives wierd exception
Type: behavior Stage: resolved
Components: Versions: Python 2.5
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: ezio.melotti, flox, kfitch
Priority: normal Keywords:

Created on 2008-11-21 20:20 by kfitch, last changed 2009-12-20 14:27 by flox. This issue is now closed.

Messages (3)
msg76200 - (view) Author: Kevin Fitch (kfitch) Date: 2008-11-21 20:20
from functools import partial
from copy import deepcopy

p = partial("Hello world".replace, "world")
p2 = deepcopy(p)

The output I get is:
Hello mom

Followed by:
<type 'exceptions.TypeError'>             Traceback (most recent call last)

/home/kfitch/<ipython console> in <module>()

/usr/lib/python2.5/ in deepcopy(x, memo, _nil)
    187                             raise Error(
    188                                 "un(deep)copyable object of type
%s" % cls)
--> 189                 y = _reconstruct(x, rv, 1, memo)
    191     memo[d] = y

/usr/lib/python2.5/ in _reconstruct(x, info, deep, memo)
    320     if deep:
    321         args = deepcopy(args, memo)
--> 322     y = callable(*args)
    323     memo[id(x)] = y
    324     if listiter is not None:

/usr/lib/python2.5/ in __newobj__(cls, *args)
     91 def __newobj__(cls, *args):
---> 92     return cls.__new__(cls, *args)
     94 def _slotnames(cls):

<type 'exceptions.TypeError'>: type 'partial' takes at least one argument

I am not entirely convinced that doing a deepcopy on a partial makes
sense, but I would expect one of:
1) An explicit exception saying it isn't allowed
2) Returning the original partial object
3) An actual copy (should the arguments its storing get deepcopied?)

P.S. This is with 2.5.2 under Linux (Ubuntu 8.04)
msg95724 - (view) Author: Florent Xicluna (flox) * (Python committer) Date: 2009-11-25 17:39
This issue is somewhat related to the same issue with pickle.
See issue1398 for the explanation.
msg95944 - (view) Author: Florent Xicluna (flox) * (Python committer) Date: 2009-12-03 20:34
Already fixed on Python trunk (2.7).
Fixed on branches 3.1 and 3.2, too.
Date User Action Args
2009-12-20 14:27:34floxsetstatus: open -> closed
resolution: fixed
stage: resolved
2009-12-07 23:49:38ezio.melottisetnosy: + ezio.melotti
2009-12-03 20:34:58floxsetmessages: + msg95944
2009-11-25 17:39:53floxsetnosy: + flox
messages: + msg95724
2008-11-21 23:11:42benjamin.petersonsetpriority: normal
2008-11-21 20:20:47kfitchcreate