2013-01-13 31 views
5

Tôi đang sử dụng cPickle để tuần tự hóa dữ liệu được sử dụng để ghi nhật ký.cPickle - Bỏ qua nội dung không thể tuần tự hóa thay vì tăng ngoại lệ

Tôi muốn có thể ném bất cứ thứ gì mình muốn vào một đối tượng, sau đó sắp xếp lại nó. Thông thường điều này là tốt với cPickle, nhưng chỉ chạy vào một vấn đề mà một trong những đối tượng tôi muốn serialize chứa một chức năng. Điều này gây ra cPickle để tăng ngoại lệ.

Tôi thà cPickle chỉ bỏ qua nội dung mà nó không thể xử lý thay vì khiến toàn bộ quá trình diễn ra.

Cách tốt nhất để thực hiện điều này là gì?

+4

Uh, bắt ngoại lệ được nêu ra? –

+2

Nắm bắt ngoại lệ sẽ không giúp ích gì vì việc tẩy sẽ vẫn thất bại thay vì "bỏ qua những thứ mà nó không thể giải quyết". – user4815162342

Trả lời

2

Tôi giả định rằng bạn đang tìm kiếm giải pháp tốt nhất và bạn không sao nếu kết quả chưa được giải quyết không hoạt động đúng cách.

Đối với trường hợp sử dụng cụ thể của bạn, bạn có thể muốn register a pickle handler cho các đối tượng chức năng. Chỉ cần làm cho nó một xử lý giả là đủ tốt cho mục đích nỗ lực tốt nhất của bạn. Việc xử lý các chức năng là có thể, nó khá phức tạp. Để tránh ảnh hưởng đến mã khác mà dưa chua, có thể bạn sẽ muốn hủy đăng ký trình xử lý khi thoát khỏi mã đăng nhập của mình.

Dưới đây là một ví dụ (không có bất kỳ xoá đăng ký):

import cPickle 
import copy_reg 
from types import FunctionType 

# data to pickle: note that o['x'] is a lambda and they 
# aren't natively picklable (at this time) 
o = {'x': lambda x: x, 'y': 1} 

# shows that o is not natively picklable (because of 
# o['x']) 
try: 
    cPickle.dumps(o) 
except TypeError: 
    print "not natively picklable" 
else: 
    print "was pickled natively" 

# create a mechanisms to turn unpickable functions int 
# stub objects (the string "STUB" in this case) 
def stub_pickler(obj): 
    return stub_unpickler,() 
def stub_unpickler(): 
    return "STUB" 
copy_reg.pickle(
    FunctionType, 
    stub_pickler, stub_unpickler) 

# shows that o is now picklable but o['x'] is restored 
# to the stub object instead of its original lambda 
print cPickle.loads(cPickle.dumps(o)) 

It in:

not natively picklable 
{'y': 1, 'x': 'STUB'} 
-1

Tại sao không chỉ bẫy ngoại lệ?

try: 
    cPickle.dumps(obj) 
except cPickle.PicklingError: 
    pass 

Bạn có thể làm điều này để giữ cho mọi thứ khác, quá ...

>>> def safe_pickle(L): 
...  result = [] 
...  for target in L: 
...    try: 
...      result.append(cPickle.dumps(target)) 
...    except (cPickle.PicklingError, TypeError): 
...      result.append(None) 
...  return result 
... 
>>> safe_pickle(["A",open('file.txt')]) 
["S'A'\n.", None] 

ngoại lệ Caught quả thật không sống.

+3

Trong trường hợp đó, mọi thứ khác mà tôi muốn tuần tự hóa không được lưu. Nó cần phải bỏ qua các lĩnh vực cụ thể mà nó không thể đối phó và vẫn serialize tất cả mọi thứ khác. –

+0

@ChrisDutrow Xem câu trả lời đã chỉnh sửa của tôi. :) Tôi hy vọng nó sẽ giúp. –

+5

@frb điều này sẽ vẫn thất bại nếu một thuộc tính (lồng nhau) của đối tượng bạn đang cố gắng để dưa không thể được ngâm. –

0

Ngoài ra, hãy thử cloudpickle:

>>> import cloudpickle 
>>> squared = lambda x: x ** 2 
>>> pickled_lambda = cloudpickle.dumps(squared) 

>>> import pickle 
>>> new_squared = pickle.loads(pickled_lambda) 
>>> new_squared(2) 
4 

we can pickle that

pip install cloudpickle và sống ước mơ của bạn. Những giấc mơ tương tự sống bởi dask, IPython song song, và PySpark.

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