2009-09-06 57 views
5

如果一個Python 3類使用協議2醃製,它應該在Python 2的工作,但不幸的是,這種失敗,因爲一些類的名稱已更改。取儲存類在Python 3在Python 2

假設我們有如下所示的代碼。

發件人

pickle.dumps(obj,2) 

接收機

pickle.loads(atom) 

爲了給出具體情況下,如果obj={},然後給出的誤差爲:

ImportError: No module named builtins

這是因爲Python 2使用__builtin__代替。

問題是解決此問題的最佳方法。

回答

13

此問題是Python issue 3675。這個bug實際上在Python 3.11中得到了修復。

如果我們導入:

from lib2to3.fixes.fix_imports import MAPPING 

MAPPING Python的2名映射到Python 3名。我們希望相反。

REVERSE_MAPPING={} 
for key,val in MAPPING.items(): 
    REVERSE_MAPPING[val]=key 

我們可以覆蓋Unpickler會和負載

class Python_3_Unpickler(pickle.Unpickler): 
    """Class for pickling objects from Python 3""" 
    def find_class(self,module,name): 
     if module in REVERSE_MAPPING: 
      module=REVERSE_MAPPING[module] 
     __import__(module) 
     mod = sys.modules[module] 
     klass = getattr(mod, name) 
     return klass 

def loads(str): 
    file = pickle.StringIO(str) 
    return Python_3_Unpickler(file).load() 

然後我們把這種負載,而不是pickle.loads。

這應該解決的問題。