Nếu bạn muốn lưu trữ [chọn] các đối tượng python vào một tệp pickle duy nhất mà không đi kèm với các mô-đun có định nghĩa lớp/hàm, bạn nên
- Sử dụng
greeter = Greeter[[greeting1, greeting2]] greeter.greet[]
9 thay vìBooyaa! Howdy!
0 - Sử dụng một số mánh khóe để đánh lừa
greeter = Greeter[[greeting1, greeting2]] greeter.greet[]
9 tin rằng việc nhập khẩu đã thực sự được xác định trongBooyaa! Howdy!
2
Dưa chua với sự phụ thuộc
Khi bạn muốn chọn một đối tượng python để lưu trữ lâu dài, bạn có thể gặp sự cố. dưa chua không lưu trữ định nghĩa đối tượng khi dưa chua. Vì vậy, ví dụ: khi bạn xây dựng một
Booyaa! Howdy!3, sau đó dưa nó và bỏ nó ở một vị trí khác, bạn cần phải xác định chính xác
Booyaa! Howdy!3 trước khi bạn có thể tải dưa ở điểm đến đích
def greeting1[]: return "Booyaa!" def greeting2[]: return "Howdy!" class Greeter: def __init__[self, greetings]: self.greetings = greetings def greet[self]: for greet in self.greetings: print[greet[]]
greeter = Greeter[[greeting1, greeting2]] greeter.greet[]
Booyaa! Howdy!
import pickle pickle.dump[greeter, open["greeter.pkl", "wb"]]
Nếu bây giờ bạn cố tải lời chào ở một nơi khác, bạn sẽ nhận được một
Booyaa! Howdy!5
> >> import pickle >>> pickle.load[open["greeter.pkl", "rb"]] Traceback [most recent call last]:File "", line 1, in AttributeError: Can't get attribute 'Greeter' on
Giải pháp 1. Cũng lưu trữ mô-đun với các định nghĩa
Một cách giải quyết vấn đề này bằng cách lưu trữ định nghĩa lớp của
Booyaa! Howdy!6 trong
Booyaa! Howdy!7, nhập
Booyaa! Howdy!6 từ
Booyaa! Howdy!9 và sao chép
Booyaa! Howdy!7 cùng với
import pickle pickle.dump[greeter, open["greeter.pkl", "wb"]]1 vào vị trí bạn muốn bỏ chọn
Tuy nhiên, bây giờ bạn đã tạo một phụ thuộc mà bạn cần quản lý. Bạn luôn phải đảm bảo rằng bạn có sẵn phiên bản phù hợp của mô-đun phù hợp khi bạn muốn mở khóa. Đặc biệt đối với việc lưu trữ lâu dài các đối tượng python, điều này đang gây ra sự cố. Sẽ tốt hơn nếu bạn có thể có tất cả đối tượng và định nghĩa trong một tệp
Giải pháp 2. Dill để giải cứu
May mắn thay, có một sự thay thế độc lập cho
Booyaa! Howdy!0 được gọi là
greeter = Greeter[[greeting1, greeting2]] greeter.greet[]9, tiếc là không đi kèm với thư viện tiêu chuẩn, vì vậy bạn phải tự cài đặt nó.
import pickle pickle.dump[greeter, open["greeter.pkl", "wb"]]4
Điều thú vị về
greeter = Greeter[[greeting1, greeting2]] greeter.greet[]9 là nó lưu trữ các định nghĩa cùng với đối tượng, miễn là chúng được định nghĩa trong
Booyaa! Howdy!2. Trong trường hợp của chúng tôi, chúng là như vậy khi chúng tôi lưu trữ đối tượng lời chào với dill, chúng tôi thực sự có thể tải lại đối tượng ngay bây giờ
import dill dill.dump[greeter, open["greeter.pkl", "wb"]]
>>> import dill >>> greeter = dill.load[open["greeter.pkl", "rb"]] >>> greeter.greet[] Booyaa! Howdy!
Nó đã làm việc
Nhưng chỉ lưu trữ các định nghĩa trong Booyaa!
Howdy!
2 không phải trong các mô-đun
Giả sử chúng ta định nghĩa
Booyaa! Howdy!6 trong một mô-đun
import pickle pickle.dump[greeter, open["greeter.pkl", "wb"]]9
người chào hỏi. py
def greeting1[]: return "Booyaa!" def greeting2[]: return "Howdy!" class Greeter: def __init__[self, greetings]: self.greetings = greetings def greet[self]: for greet in self.greetings: print[greet[]]
import dill from greeter import Greeter, greeting1, greeting2 g = Greeter[[greeting1, greeting2]] dill.dump[g, open["greeter.pkl", "wb"]]
Sau đó, dưa chua lại không tải được khi
Booyaa! Howdy!7 bị thiếu hoặc bỏ lỡ các định nghĩa đúng
> >> import dill >>> greeter = dill.load[open["_notebooks/greeter.pkl", "rb"]] Traceback [most recent call last]:File "", line 1, in File "/Users/oege/.pyenv/versions/3.8.5/lib/python3.8/site-packages/dill/_dill.py", line 278, in load return Unpickler[file, ignore=ignore, **kwds].load[] File "/Users/oege/.pyenv/versions/3.8.5/lib/python3.8/site-packages/dill/_dill.py", line 481, in load obj = StockUnpickler.load[self] File "/Users/oege/.pyenv/versions/3.8.5/lib/python3.8/site-packages/dill/_dill.py", line 471, in find_class return StockUnpickler.find_class[self, module, name] ModuleNotFoundError: No module named 'greeter'
cách giải quyết. chuyển các định nghĩa sang Booyaa!
Howdy!
2
Bạn có thể giải quyết vấn đề này bằng cách
> >> import pickle >>> pickle.load[open["greeter.pkl", "rb"]] Traceback [most recent call last]:File "", line 1, in AttributeError: Can't get attribute 'Greeter' on2 các định nghĩa đã nhập
greeter = Greeter[[greeting1, greeting2]] greeter.greet[]0
greeter = Greeter[[greeting1, greeting2]] greeter.greet[]1
Và điều này hoạt động
greeter = Greeter[[greeting1, greeting2]] greeter.greet[]2
Tránh sử dụng > >> import pickle
>>> pickle.load[open["greeter.pkl", "rb"]]
Traceback [most recent call last]:File "", line 1, in AttributeError: Can't get attribute 'Greeter' on
3 trong Booyaa!
Howdy!
2
Tuy nhiên, việc
> >> import pickle >>> pickle.load[open["greeter.pkl", "rb"]] Traceback [most recent call last]:File "", line 1, in AttributeError: Can't get attribute 'Greeter' on3 mọi thứ hơi rườm rà và bạn có thể muốn tự động hóa việc này cho người dùng của mình
Một cách để làm điều này là khai báo một classmethod
> >> import pickle >>> pickle.load[open["greeter.pkl", "rb"]] Traceback [most recent call last]:File "", line 1, in AttributeError: Can't get attribute 'Greeter' on6
sử dụng > >> import pickle
>>> pickle.load[open["greeter.pkl", "rb"]]
Traceback [most recent call last]:File "", line 1, in AttributeError: Can't get attribute 'Greeter' on
7
chào mừng2. py
greeter = Greeter[[greeting1, greeting2]] greeter.greet[]3
Bây giờ bạn có thể nhập chính
greeter = Greeter[[greeting1, greeting2]] greeter.greet[]4
Booyaa! Howdy!
sử dụng > >> import pickle
>>> pickle.load[open["greeter.pkl", "rb"]]
Traceback [most recent call last]:File "", line 1, in AttributeError: Can't get attribute 'Greeter' on
8
người chào3. py
greeter = Greeter[[greeting1, greeting2]] greeter.greet[]6
greeter = Greeter[[greeting1, greeting2]] greeter.greet[]7
Booyaa! Howdy!
Phần kết luận
Hy vọng điều này có thể hữu ích cho một số bạn muốn lưu trữ các đối tượng python và không lo lắng về các phụ thuộc mô-đun