2015-06-14 93 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 
相關問題