Bạn có thể quyết định và thực hiện như thế nào bất kỳ loại trước đó unpicklable được ngâm và unpickled: xem thư viện chuẩn mô-đun copy_reg (được đổi tên thành copyreg
bằng Python 3. *).
Về cơ bản, bạn cần cung cấp một hàm, cho một thể hiện kiểu, giảm nó thành một bộ - với cùng một giao thức như phương thức đặc biệt reduce (ngoại trừ việc giảm phương pháp đặc biệt không có đối số) miễn là nó được gọi trực tiếp trên đối tượng, trong khi hàm bạn cung cấp sẽ lấy đối tượng làm đối số duy nhất).
Thông thường, bộ trả về bạn có 2 mục: một cuộc gọi và một bộ đối số để chuyển cho nó. Người gọi phải được đăng ký là "nhà xây dựng an toàn" hoặc tương đương có thuộc tính __safe_for_unpickling__
với giá trị thực. Các mục đó sẽ được chọn, và vào thời gian không được gọi, các cuộc gọi sẽ được gọi với các đối số đã cho và phải trả về đối tượng chưa được đánh dấu. Ví dụ, giả sử rằng bạn muốn chỉ mô-đun dưa theo tên, để giải thích chúng chỉ có nghĩa là nhập lại chúng (ví dụ: giả sử đơn giản là bạn không quan tâm đến các mô-đun được sửa đổi động, gói lồng nhau, v.v., v.v.) mô-đun cấp cao nhất đơn giản).Sau đó:
>>> import sys, pickle, copy_reg
>>> def savemodule(module):
... return __import__, (module.__name__,)
...
>>> copy_reg.pickle(type(sys), savemodule)
>>> s = pickle.dumps(sys)
>>> s
"c__builtin__\n__import__\np0\n(S'sys'\np1\ntp2\nRp3\n."
>>> z = pickle.loads(s)
>>> z
<module 'sys' (built-in)>
Tôi đang sử dụng hình thức ASCII old-fashioned của dưa để s
, các chuỗi chứa dưa, rất dễ dàng để kiểm tra: nó hướng dẫn Công cụ unpickling gọi được xây dựng trong chức năng nhập khẩu, với string sys
là đối số duy nhất của nó. Và z
cho thấy rằng điều này thực sự cho chúng ta trở lại mô-đun sys
được tích hợp như là kết quả của việc giải nén, như mong muốn.
Bây giờ, bạn sẽ phải làm cho mọi việc phức tạp hơn một chút so với chỉ __import__
(bạn sẽ phải giải quyết và khôi phục thay đổi động, điều hướng vùng tên lồng nhau, v.v.) hãy gọi copy_reg.constructor
(chuyển làm đối số cho chức năng của riêng bạn thực hiện công việc này) trước khi bạn copy_reg
chức năng tiết kiệm mô-đun trả về chức năng khác của bạn (và, nếu chạy riêng, cũng trước khi bạn bỏ ghim những dưa chua bạn đã thực hiện bằng chức năng đã nói). Nhưng tôi hy vọng những trường hợp đơn giản này sẽ giúp cho thấy rằng thực sự không có gì nhiều với nó, đó là tất cả "thực chất" phức tạp! -)
Đậu Java .. Python Pickles .. Tôi muốn điều tiết các nerds đã đưa ra điều này công cụ cutesy –