42
42
class LazyRegex(object):
43
43
"""A proxy around a real regex, which won't be compiled until accessed."""
46
45
# These are the parameters on a real _sre.SRE_Pattern object, which we
47
46
# will map to local members so that we don't have the proxy overhead.
48
47
_regex_attributes_to_copy = [
49
'__copy__', '__deepcopy__', 'findall', 'finditer', 'match',
50
'scanner', 'search', 'split', 'sub', 'subn'
48
'__copy__', '__deepcopy__', 'findall', 'finditer', 'match',
49
'scanner', 'search', 'split', 'sub', 'subn'
53
52
# We use slots to keep the overhead low. But we need a slot entry for
54
53
# all of the attributes we will copy
55
54
__slots__ = ['_real_regex', '_regex_args', '_regex_kwargs',
56
] + _regex_attributes_to_copy
55
] + _regex_attributes_to_copy
58
57
def __init__(self, args=(), kwargs={}):
59
58
"""Create a new proxy object, passing in the args to pass to re.compile
79
78
except re.error as e:
80
79
# raise InvalidPattern instead of re.error as this gives a
81
80
# cleaner message to the user.
82
raise InvalidPattern('"' + args[0] + '" ' +str(e))
81
raise InvalidPattern('"' + args[0] + '" ' + str(e))
84
83
def __getstate__(self):
85
84
"""Return the state to use when pickling."""
137
136
_real_re_compile = re.compile
138
137
if _real_re_compile is lazy_compile:
139
138
raise AssertionError(
140
"re.compile has already been overridden as lazy_compile, but this would" \
141
" cause infinite recursion")
139
"re.compile has already been overridden as lazy_compile, but this "
140
"would cause infinite recursion")
144
143
# Some libraries calls re.finditer which fails it if receives a LazyRegex.