python / cpython

The Python programming language
https://www.python.org
Other
62.35k stars 29.94k forks source link

deepcopy can't handle custom metaclasses #36650

Closed 26af53de-f307-4809-a4a7-9d50203b0a97 closed 22 years ago

26af53de-f307-4809-a4a7-9d50203b0a97 commented 22 years ago
BPO 560794
Nosy @gvanrossum
Files
  • copy.py.diff
  • copy.py.diff
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields: ```python assignee = 'https://github.com/gvanrossum' closed_at = created_at = labels = ['library'] title = "deepcopy can't handle custom metaclasses" updated_at = user = 'https://bugs.python.org/glchapman' ``` bugs.python.org fields: ```python activity = actor = 'gvanrossum' assignee = 'gvanrossum' closed = True closed_date = None closer = None components = ['Library (Lib)'] creation = creator = 'glchapman' dependencies = [] files = ['494', '495'] hgrepos = [] issue_num = 560794 keywords = [] message_count = 3.0 messages = ['10933', '10934', '10935'] nosy_count = 2.0 nosy_names = ['gvanrossum', 'glchapman'] pr_nums = [] priority = 'normal' resolution = 'accepted' stage = None status = 'closed' superseder = None type = None url = 'https://bugs.python.org/issue560794' versions = ['Python 2.2'] ```

    26af53de-f307-4809-a4a7-9d50203b0a97 commented 22 years ago

    This is essentially the same problem as that reported in bug 494904 for pickle: deepcopy should treat instances of custom metaclasses the same way it treats instances of type 'type'. I've attached a provisional fix which is basically a copy of the patch made to pickle (it checks to see if the type of the thing being deepcopied is a subclass of type).

    One question: it seems to me that the exception handling code is unnecessary both here and in the pickle module. In both cases, the first parameter to subclass is the result of a call to 'type' and the second is type 'type' itself, so it doesn't seem like there's any reason to worry about a TypeError.

    26af53de-f307-4809-a4a7-9d50203b0a97 commented 22 years ago

    Logged In: YES user_id=86307

    I changed the patch so that issubclass is called before the attempt to access __deepcopy__ (to avoid unbound instance method problem methioned in 494904).

    gvanrossum commented 22 years ago

    Logged In: YES user_id=6380

    Thanks; I've checked this in. For the reason of the except clause, see python.org/sf/502085.