2015-06-14 92 views
2

相关:pickle load error "__init__() takes exactly 2 arguments (1 given)"的Python:泡菜的错误:__new __()到底需要2个参数(1给出)

import cPickle as pickle 

pklfile = "test.pkl" 

all_names = {} 
class Name(object): 
    def __new__(cls, c, s="", v=""): 
     name = "%s %s %s" % (c, s, v) 
     if all_names.has_key(name): 
      return all_names[name] 
     else: 
      self = all_names[name] = object.__new__(cls) 
      self.c, self.s, self.v = c, s, v 

     return self 

with open(pklfile, 'wb') as output: 
    pickle.dump(Name("hi"), output, pickle.HIGHEST_PROTOCOL) 

with open(pklfile, 'rb') as input: 
    name_obj = pickle.load(input) 

OUTPUT:

Traceback (most recent call last): 
    File "dopickle.py", line 21, in <module> 
    name_obj = pickle.load(input) 
TypeError: __new__() takes at least 2 arguments (1 given) 

是否有可能使这项工作,而无需第二个参数作为可选项?

回答

5

使用__getnewargs__,它在对象被腌制时调用,并提供一个额外参数的元组,以便在取出时传递给__new__

import cPickle as pickle 

pklfile = "test.pkl" 

all_names = {} 
class Name(object): 
    def __new__(cls, c, s="", v=""): 
     name = "%s %s %s" % (c, s, v) 
     if all_names.has_key(name): 
      return all_names[name] 
     else: 
      self = all_names[name] = object.__new__(cls) 
      self.c, self.s, self.v = c, s, v 

     return self 

    def __getnewargs__(self): 
     return (Name.__repr__(self),) 

    def __repr__(self): 
     return '<Name %r, %r, %r>' % (self.c, self.s, self.v) 

    def __str__(self): 
     return "%s %s %s" % (self.c, self.s, self.v) 

with open(pklfile, 'wb') as output: 
    pickle.dump(Name("hi"), output, pickle.HIGHEST_PROTOCOL) 

with open(pklfile, 'rb') as input: 
    name_obj = pickle.load(input) 
    print name_obj 
相关问题