我的测试代码在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
返回的对象或者有什么改变?
有人可以提供使用pickle
和pyparsing 2.0.7
的简短代码示例吗?
我的真正语法需要几分钟才能解析,所以我真的很希望能够在进一步处理之前存储结果。
答案 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
的泡菜协议的更多信息