- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个对象 gui_project
,它有一个属性 .namespace
,这是一个命名空间字典。 (即从字符串到对象的字典。)
(这在类似 IDE 的程序中使用,让用户在 Python shell 中定义自己的对象。)
我想 pickle 这个 gui_project
以及命名空间。问题是,命名空间中的某些对象(即 .namespace
dict 的值)不是可 picklable 对象。例如,其中一些引用了 wxPython 小部件。
我想过滤掉不可 picklable 的对象,即将它们从 pickled 版本中排除。
我该怎么做?
(我尝试过的一件事是一个一个地处理值并尝试 pickle 它们,但是发生了一些无限递归,我需要避免这种情况。)
(我现在确实实现了一个 GuiProject.__getstate__
方法,以摆脱 không gian tên
之外的其他不可修改的东西。)
câu trả lời hay nhất
我会使用 pickler 对持久对象引用的文档化支持。持久对象引用是由 pickle 引用但未存储在 pickle 中的对象。
http://docs.python.org/library/pickle.html#pickling-and-unpickling-external-objects
ZODB 多年来一直使用此 API,因此非常稳定。 unpickling 时,您可以将对象引用替换为您喜欢的任何内容。在您的情况下,您可能希望用指示无法 pickle 对象的标记替换对象引用。
你可以从这样的东西开始(未经测试):
import cPickle
def persistent_id(obj):
if isinstance(obj, wxObject):
return "filtered:wxObject"
khác:
return None
class FilteredObject:
def __init__(self, about):
self.about = about
def __repr__(self):
return 'FilteredObject(%s)' % repr(self.about)
def persistent_load(obj_id):
if obj_id.startswith('filtered:'):
return FilteredObject(obj_id[9:])
khác:
raise cPickle.UnpicklingError('Invalid persistent id')
def dump_filtered(obj, file):
p = cPickle.Pickler(file)
p.persistent_id = persistent_id
p.dump(obj)
def load_filtered(file)
u = cPickle.Unpickler(file)
u.persistent_load = persistent_load
return u.load()
然后只需调用 dump_filtered() 和 load_filtered() 而不是 pickle.dump() 和 pickle.load()。 wxPython 对象将被 pickle 为持久 ID,在 unpickling 时被 FilteredObjects 替换。
您可以通过过滤掉不属于内置类型且没有 __getstate__
方法的对象来使解决方案更通用。
gia hạn(2010 年 11 月 15 日):这是一种使用包装类实现相同目的的方法。使用包装器类而不是子类,可以保留在记录的 API 中。
from cPickle import Pickler, Unpickler, UnpicklingError
class FilteredObject:
def __init__(self, about):
self.about = about
def __repr__(self):
return 'FilteredObject(%s)' % repr(self.about)
class MyPickler(object):
def __init__(self, file, protocol=0):
pickler = Pickler(file, protocol)
pickler.persistent_id = self.persistent_id
self.dump = pickler.dump
self.clear_memo = pickler.clear_memo
def persistent_id(self, obj):
if not hasattr(obj, '__getstate__') and not isinstance(obj,
(basestring, int, long, float, tuple, list, set, dict)):
return "filtered:%s" % type(obj)
khác:
return None
class MyUnpickler(object):
def __init__(self, file):
unpickler = Unpickler(file)
unpickler.persistent_load = self.persistent_load
self.load = unpickler.load
self.noload = unpickler.noload
def persistent_load(self, obj_id):
if obj_id.startswith('filtered:'):
return FilteredObject(obj_id[9:])
khác:
raise UnpicklingError('Invalid persistent id')
nếu __name__ == '__main__':
from cStringIO import StringIO
class UnpickleableThing(object):
vượt qua
f = StringIO()
p = MyPickler(f)
p.dump({'a': 1, 'b': UnpickleableThing()})
f.tìm kiếm(0)
u = MyUnpickler(f)
obj = u.load()
print obj
assert obj['a'] == 1
assert isinstance(obj['b'], FilteredObject)
assert obj['b'].about
关于Python:用一些不可 pickle 的项目 pickle 字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4080688/
Tôi đang cố gắng ghi đầu ra xml đã được quét vào json. Việc tìm nạp không thành công vì mục này không thể tuần tự hóa được. Từ câu hỏi gợi ý rằng bạn cần xây dựng một đường dẫn, câu trả lời không được cung cấp nằm ngoài phạm vi của câu hỏi về trình tuần tự hóa vụn vặt SO. Địa điểm
Có cách nào để phân biệt xem một tham số có thể đánh giá được trong thời gian biên dịch hay chỉ có thể đánh giá được trong thời gian chạy bằng cách nạp chồng một hàm? Giả sử tôi có hàm sau: std::string lookup(int x) { return table::va
Tôi đang viết một ứng dụng sử dụng mẫu MVVM. Tôi cung cấp dữ liệu cho Chế độ xem bằng cách đặt thuộc tính DataContext của Chế độ xem thành một phiên bản của ViewModel. Nói chung tôi chỉ sử dụng Binding từ đó
Đối với một dự án, tôi đang thu thập nhiều lệnh hồng ngoại bằng cảm biến có mô-đun python đơn giản. . Tôi nhận được chuỗi byte sau: commando1= b'7g4770CQfwCTVT9bQDAzVEBMagGR
Tôi có một phương pháp tính thuế khi người dùng thanh toán bằng cách sử dụng Cartridge làm khung cửa hàng của tôi. tax = tax * phép tính thập phân(str(settings.SHOP_DEFAULT_TAX_RATE)) hoạt động tốt. Chạy
Tôi đang tạo một chương trình vẽ bằng pygame nơi tôi muốn cung cấp cho người dùng tùy chọn lưu trạng thái chính xác của chương trình và sau đó tải lại sau. Tại thời điểm này, tôi lưu một bản sao của từ điển chung của mình và sau đó lặp lại nó, chọn từng đối tượng. pyga
Trước C++ 11, tôi có thể tạo một lớp không thể sao chép bằng cách sử dụng: private: MyClass(const MyClass& operator=(const MyClass&);
Xin chào mọi người :) Tôi đang sử dụng 1.5.4-all (22-10-2014) (Trình biên dịch Microsoft Visual C++ 18.00.21005.1 cho nền tảng x86) trong dự án VC++ của tôi. TÔI
Tôi có một tệp python: analyze.py: def svm_analyze_AHE(file_name): # lấy tệp abp testdata = pd.
Câu hỏi này đã có câu trả lời: Làm cách nào để tuần tự hóa kết quả SqlAlchemy thành JSON? (37 câu trả lời) Đã đóng 4 năm trước. Tôi đang viết một truy vấn nhỏ để lấy dữ liệu từ cơ sở dữ liệu mysql,
Tôi là người mới bắt đầu sử dụng Python và tôi đang gặp một số vấn đề với JSON. Trong hướng dẫn tôi đang sử dụng có hai hàm: def read_json(filename): data = [] if os.pa
Tôi hiện đang phát triển một ứng dụng vẽ dựa trên HTML5 Canvas/JavaScript nhỏ cho iPad. Nó chạy trong Safari. Cho đến nay, mọi thứ đều diễn ra tốt đẹp ngoại trừ một điều. Nếu tôi xoay thiết bị,
Đoạn mã sau không được biên dịch bằng Visual Studio 2013: #include struct X { X() = default X(const X&) = delete;
Xin chào, tôi đã tạo một trình phân loại văn bản và tôi đã sử dụng nó trong đó và nó trả về một mảng và tôi muốn trả về jsonresponse nhưng dòng mã cuối cùng lại báo lỗi 'array(['cycling'], dtype =object) không phải khả thi
Tôi đang sử dụng Flask và Flask-Login để xác thực người dùng. Flask-Sqlalchemy lưu trữ các mô hình này trong cơ sở dữ liệu sqlite: ROLE_USER = 0 ROLE_ADMIN =
Nếu bạn cố gắng gửi một đối tượng không thể tuần tự hóa JSON (bất kỳ đối tượng nào ngoài danh sách, từ điển, số nguyên, v.v.), bạn sẽ nhận được thông báo lỗi sau: "errorMessage": "Đối tượng thuộc loại tập hợp không phải là JSON
Tôi gặp sự cố khi cố gắng di chuyển std::vector trong đó T rõ ràng là không thể di chuyển được (không có toán tử khởi tạo/gán di chuyển nào được xác định, nó chứa các con trỏ bên trong) nhưng tại sao hàm di chuyển của vectơ lại gọi T
Tôi đang cố gắng trả lại mã thông báo cho người dùng sau khi họ đăng nhập thành công nhưng tôi vẫn gặp phải lỗi sau: TypeError: Đối tượng thuộc loại 'byte' không thể tuần tự hóa JSON. Làm cách nào để khắc phục điều này? Đây là mã của tôi cho đến nay: nếu người dùng:
Tôi là một lập trình viên xuất sắc, rất giỏi!