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'}
Nguồn
2013-01-13 23:13:03
Uh, bắt ngoại lệ được nêu ra? –
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