cuốn sách gpt4 ai đã làm

TypeError trên dưa.load sử dụng lớp bắt nguồn từ SimpleNamespace

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-03 15:43:08 26 4
mua khóa gpt4 Nike

Hãy xem xét mã Python (phiên bản 3.5) này:

import pickle
từ các loại nhập SimpleNamespace

lớp MyClass1 (danh sách):
định nghĩa __init__(tự, x):
tự.append(x)

lớp MyClass2(SimpleNamespace):
định nghĩa __init__(tự, x):
tự.x = x

a0 = SimpleNamespace(x=99)
a1 = MyClass1(99)
a2 = MyClass2(99)

print('* SimpleNamespace:', dưa chua.loads(pickle.dumps(a0)))
print('* MyClass1:', dưa chua.loads(pickle.dumps(a1)))
print('* MyClass2:', dưa chua.loads(pickle.dumps(a2)))

Điều này hoạt động tốt với hai cái đầu tiên (a0 và a1), nhưng khi xử lý a2 tôi gặp lỗi:

* SimpleNamespace: không gian tên(x=99)
* MyClass1: [99]
Traceback (most recent call last):
Tệp "./picktest.py", dòng 20, trong
print('* MyClass2:', dưa chua.loads(pickle.dumps(a2)))
TypeError: __init__() thiếu 1 đối số vị trí bắt buộc: 'x'

quan sát:

  • Không gian tên đơn giản Có thể ngâm.
  • Bắt nguồn từ các loại khác nhau (danh sách) các lớp có thể được (không) chọn.
  • nếu xuất phát từ Không gian tên đơn giản Lớp này có một tham số yêu cầu __init__, nó không thể được giải nén. (Lỗi xảy ra ởdưa chua.loads)

Xin lưu ý rằng tôi đã cố gắng tự.x = x Thay thế bằng vượt qua Và không có gì thay đổi.

Có cách nào khác để thực hiện công việc này ngoài việc triển khai lại MyClass2 mà không cần kế thừa không?

câu trả lời hay nhất

问题是 Không gian tên đơn giản 定义了一个 __giảm bớt__,dưa chua Sử dụng điều này để giải nén các đối tượng của bạn. Nhưng,Không gian tên đơn giản 中定义的 __giảm bớt__ với bạn __init__ Không nhất quán. Bạn có thể xác định của riêng bạn __giảm bớt__ Để tránh điều này:

import pickle
từ các loại nhập SimpleNamespace

lớp MyClass1 (danh sách):

định nghĩa __init__(tự, x):
tự.append(x)

lớp MyClass2(SimpleNamespace):

định nghĩa __init__(tự, x):
tự.x = x

chắc chắn __reduce__(tự):
trả về (self.__class__, (self.x,))

a0 = SimpleNamespace(x=99)
a1 = MyClass1(99)
a2 = MyClass2(99)

print('* SimpleNamespace:', dưa chua.loads(pickle.dumps(a0)))
print('* MyClass1:', dưa chua.loads(pickle.dumps(a1)))
print('* MyClass2:', dưa chua.loads(pickle.dumps(a2)))

Về python - TypeError trên dưa.load bằng cách sử dụng một lớp bắt nguồn từ SimpleNamespace, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/51519351/

26 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress