Ví dụ thì là Python

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

  1. Sử dụng
    greeter = Greeter([greeting1, greeting2])
    greeter.greet()
    
    9 thay vì
    Booyaa!
    Howdy!
    
    0
  2. 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 trong
    Booyaa!
    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 <module>AttributeError: Can't get attribute 'Greeter' on __main__' (built-in)>

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 <module>  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 <module>AttributeError: Can't get attribute 'Greeter' on __main__' (built-in)>
2 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 <module>AttributeError: Can't get attribute 'Greeter' on __main__' (built-in)>
3 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 <module>AttributeError: Can't get attribute 'Greeter' on __main__' (built-in)>
6

sử dụng
> >> import pickle
>>> pickle.load(open("greeter.pkl", "rb"))
Traceback (most recent call last):File "", line 1, in <module>AttributeError: Can't get attribute 'Greeter' on __main__' (built-in)>
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 <module>AttributeError: Can't get attribute 'Greeter' on __main__' (built-in)>
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

Dill trong Python là gì?

dill có thể được sử dụng để lưu trữ các đối tượng python vào một tệp, nhưng cách sử dụng chính là gửi các đối tượng python qua mạng dưới dạng luồng byte. dill is quite flexible, and allows arbitrary user defined classes and functions to be serialized.

Thì là nhanh hơn dưa chua?

Làm cách nào để cài đặt thì là trong Python?

Nhập “ pip install dill ” (không có dấu ngoặc kép) trong dòng lệnh và nhấn Enter lần nữa . Điều này cài đặt dill cho cài đặt Python mặc định của bạn.

dưa chua trong ví dụ Python là gì?

“Pickling” là quá trình theo đó hệ thống phân cấp đối tượng Python được chuyển đổi thành luồng byte và “unpickling” là thao tác ngược lại, .