TypeError:无法深入复制此模式对象

时间:2011-06-08 13:17:55

标签: python regex deep-copy

尝试在“变量”类中理解此错误。

我希望在我的“Variable”类中存储一个sre.SRE_Pattern。我刚刚开始复制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)

5 个答案:

答案 0 :(得分:9)

deepcopy对您的课程一无所知,也不知道如何复制它们。

您可以通过实施deepcopy方法告诉__deepcopy__()如何复制对象:

class VariableWithoutRE(object):
   # ...
   def __deepcopy__(self):
      return VariableWithoutRE(self.name, self.regexTarget, self.type)

答案 1 :(得分:1)

这似乎已在python版本3.7+中修复:

  

现在可以使用copy.copy()和copy.deepcopy()复制已编译的正则表达式和匹配对象。 (由Serhiy Storchaka在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

答案 2 :(得分:0)

问题似乎出在已编译的正则表达式上。 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中。

答案 3 :(得分:0)

这可以通过在3.7版之前的python中修补copy模块来解决:

import copy
import re 

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

o = re.compile('foo')
assert copy.deepcopy(o) == o

答案 4 :(得分:0)

如果,您的此类(及其子类_)的实例不需要进行深度复制,但仅会引起问题,因为它们是对象图的一部分>需要需要深度复制,那么您可以执行以下操作:

const App = () => {
    const something=(event)=> {
        if (event.keyCode === 13) {
            console.log('enter')
        }
    }
return (
    <div className="App">
        <h1>Hello CodeSandbox</h1>
        <h2>Start editing to see some magic happen!</h2>
        <input  type='text' onKeyDown={(e) => something(e) }/>
    </div>
);
}

现在,您需要重新小心。我所做的假设。如果您开始更改此类的任何实例,则可能会出现副作用,因为实际上并未进行过深度复制。仅当您需要在其他地方进行深度复制并且您确定不关心此类类和深度复制时,这才值得。