TypeError: не может копировать этот объект - PullRequest
13 голосов
/ 08 июня 2011

Пытаюсь понять эту ошибку в моем классе "Переменная".

Я надеялся сохранить sre.SRE_Pattern в моем классе "Variable".Я только начал копировать класс Variable и заметил, что он вызывает изменение всех экземпляров моего класса Variable.Теперь я понимаю, что мне нужно глубоко копировать этот класс, но теперь я сталкиваюсь с «TypeError: не могу копировать этот объект шаблона».Конечно, я могу сохранить шаблон в виде текстовой строки, но остальная часть моего кода уже ожидает скомпилированный шаблон!Что было бы лучшим способом скопировать мой класс Variable с объектом шаблона?

import re
from copy import deepcopy

class VariableWithRE(object):
    "general variable class"
    def __init__(self,name,regexTarget,type):
        self.name = name
        self.regexTarget = re.compile(regexTarget, re.U|re.M) 
        self.type = type 

class VariableWithoutRE(object):
    "general variable class"
    def __init__(self,name,regexTarget,type):
        self.name = name
        self.regexTarget = regexTarget
        self.type = type 

if __name__ == "__main__":

    myVariable = VariableWithoutRE("myName","myRegexSearch","myType")
    myVariableCopy = deepcopy(myVariable)

    myVariable = VariableWithRE("myName","myRegexSearch","myType")
    myVariableCopy = deepcopy(myVariable)

Ответы [ 4 ]

9 голосов
/ 08 июня 2011

deepcopy ничего не знает о ваших классах и не знает, как их скопировать.

Вы можете указать deepcopy, как копировать ваши объекты, применяя метод __deepcopy__():

class VariableWithoutRE(object):
   # ...
   def __deepcopy__(self):
      return VariableWithoutRE(self.name, self.regexTarget, self.type)
1 голос
/ 19 октября 2018

Похоже, это исправлено в Python версии 3.7 +:

Скомпилированные объекты регулярных выражений и сопоставлений теперь можно копировать с помощью copy.copy () и copy.deepcopy ().(Внесено Сергеем Сторчака в bpo-10076.)

согласно: https://docs.python.org/3/whatsnew/3.7.html#re

Тестирование:

import re,copy

class C():
    def __init__(self):
       self.regex=re.compile('\d+')

myobj = C()    
foo = copy.deepcopy(myobj)
foo.regex == myobj.regex
# True
0 голосов
/ 08 июля 2019

Это можно обойти, исправив модуль copy в python до 3.7:

import copy
import re 

copy._deepcopy_dispatch[type(re.compile(''))] = lambda r, _: r

o = re.compile('foo')
assert copy.deepcopy(o) == o
0 голосов
/ 01 сентября 2018

Кажется, проблема в скомпилированном регулярном выражении.deepcopy не может справиться с ними.

Минимальный пример дает мне ту же ошибку:

import re,copy
class C():
    def __init__(self):
        self.regex=re.compile('\d+')

myobj = C()    
copy.deepcopy(myobj)

Это выдает ошибку: TypeError: cannot deepcopy this pattern object.Я в python3.5.

...