[Python-ideas] Add regex pattern literal p""

Ma Lin malincns at 163.com
Fri Dec 28 04:54:48 EST 2018


Reply to Stefan Behnel and Chris Angelico.

On 18-12-27 22:42, Stefan Behnel wrote:
 >  >>> import pickle, re
 >  >>> p = re.compile("[abc]")
 >  >>> pickle.dumps(p)
 >  b'\x80\x03cre\n_compile\nq\x00X\x05\x00\x00\x00[abc]q\x01K 
\x86q\x02Rq\x03.'
 >
 > What this does, essentially, is to make the pickle loader pass the 
original regex pattern string into re.compile() to "unpickle" it. 
Meaning, it compiles the regex on the way in. Thus, there isn't much to 
gain from using (the current form of) regex pickling here.

Yes, re module only pickles pattern string and flags, it's safe for 
cross-version pickle/unpickle. re module's pickle code:

def _pickle(p):
     return _compile, (p.pattern, p.flags)
copyreg.pickle(Pattern, _pickle, _compile)

On 18-12-28 1:27, Chris Angelico wrote:
 > What Stefan pointed out regarding the stdlib's "re" module is also
 > true of the third party "regex" - unpickling just compiles from the
 > original string.

I had followed regex module for a year, it does pickle the compiled 
data, this is its code:

def _pickle(pattern):
     return _regex.compile, pattern._pickled_data
_copy_reg.pickle(Pattern, _pickle)

// in _regex.c file
self->pickled_data = Py_BuildValue("OnOOOOOnOnn", pattern, flags,
     code_list, groupindex, indexgroup, named_lists, named_list_indexes,
     req_offset, required_chars, req_flags, public_group_count);
if (!self->pickled_data) {
     Py_DECREF(self);
     return NULL;
}



More information about the Python-ideas mailing list