尝试在“变量”类中理解此错误。
我希望在我的“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)
答案 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>
);
}
现在,您需要重新小心。我所做的假设。如果您开始更改此类的任何实例,则可能会出现副作用,因为实际上并未进行过深度复制。仅当您需要在其他地方进行深度复制并且您确定不关心此类类和深度复制时,这才值得。