2009-09-06 45 views
5

Nếu một lớp Python 3 được chọn bằng giao thức 2, nó được cho là làm việc trong Python 2, nhưng không may, điều này không thành công vì tên của một số lớp đã thay đổi.Gỡ lớp học từ Python 3 trong Python 2

Giả sử chúng tôi có mã được gọi là như sau.

Sender

pickle.dumps(obj,2) 

Receiver

pickle.loads(atom) 

Để cung cấp cho một trường hợp cụ thể, nếu obj={}, sau đó các lỗi nhất định là:

ImportError: No module named builtins

Điều này là do Python 2 sử dụng __builtin__ thay .

Câu hỏi là cách tốt nhất để khắc phục vấn đề này.

Trả lời

13

Sự cố này là Python issue 3675. Lỗi này thực sự được sửa trong Python 3.11.

Nếu chúng tôi nhập khẩu:

from lib2to3.fixes.fix_imports import MAPPING 

LẬP BẢN ĐỒ maps Python 2 tên với tên Python 3. Chúng tôi muốn điều này ngược lại.

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

Chúng ta có thể ghi đè lên Unpickler và tải

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() 

Sau đó chúng tôi gọi tải này thay vì pickle.loads.

Điều này sẽ giải quyết được sự cố.

Các vấn đề liên quan