在Python 3.5.1中pickle ParseResult时出错

时间:2016-02-06 16:02:20

标签: python pyparsing

我的测试代码在Python 2.7.11中有效,但在Python 3.5.1中失败:

import pyparsing as pp
import pickle

class Greeting():
    def __init__(self, toks):
        self.salutation = toks[0]
        self.greetee = toks[1]

word = pp.Word(pp.alphas+"'.")
salutation = pp.OneOrMore(word)
comma = pp.Literal(",")
greetee = pp.OneOrMore(word)
endpunc = pp.oneOf("! ?")
greeting = salutation + pp.Suppress(comma) + greetee + pp.Suppress(endpunc)
greeting.setParseAction(Greeting)

string = 'Good morning, Miss Crabtree!'

g = greeting.parseString(string)

pkl = 'test .pkl'
pickle.dump(g, open(pkl, 'wb'))
pickle.load(open(pkl, 'rb'))

错误消息如下:

Traceback (most recent call last):
File "C:/Users/Arne/parser/test.py", line 23, in <module>
   pickle.load(open(pkl, 'rb'))
TypeError: __new__() missing 1 required positional argument: 'toklist'

__new__()是指pyparsing.ParseResults.__new__(cls, toklist, name=None, asList=True, modal=True )

是否仍然可以在Python 3.5.1中挑选由pyparsing返回的对象或者有什么改变?

有人可以提供使用picklepyparsing 2.0.7的简短代码示例吗?

我的真正语法需要几分钟才能解析,所以我真的很希望能够在进一步处理之前存储结果。

1 个答案:

答案 0 :(得分:2)

这失败了protocol=2(可选的第3个arg到pickle.dump),但是如果使用pickle protocol = 0或1则通过。在Python 2.7.10中,0是默认协议。在Python 3.5上,pickle具有协议0-4,并且pickling ParseResults仅适用于协议0和1.但是在Py3.5中,默认协议已经更改为3.您现在可以通过指定协议来解决此问题0或1。

有关https://docs.python.org/3/library/pickle.html?highlight=pickle#data-stream-format

的泡菜协议的更多信息