Khi gói một bộ lặp (nội bộ) thường phải định tuyến lại phương thức __iter__
đến vòng lặp cơ bản. Hãy xem xét ví dụ sau:"yield from iterable" vs "return iter (iterable)"
class FancyNewClass(collections.Iterable):
def __init__(self):
self._internal_iterable = [1,2,3,4,5]
# ...
# variant A
def __iter__(self):
return iter(self._internal_iterable)
# variant B
def __iter__(self):
yield from self._internal_iterable
Có sự khác biệt đáng kể nào giữa biến thể A và B không? Biến thể Trả về đối tượng trình lặp đã được truy vấn qua iter()
từ nội bộ có thể lặp lại. Biến thể B trả về một đối tượng máy phát điện trả về các giá trị từ vòng lặp nội bộ. Là một hay khác thích hợp hơn vì một lý do nào đó? Trong collections.abc
phiên bản yield from
được sử dụng. Biến thể return iter()
là mẫu mà tôi đã sử dụng cho đến bây giờ.
Giả sử mục tiêu là để chỉ đơn giản là chuyển/lộ tiềm ẩn iterable, tức là không có sửa đổi/tiêm các mặt hàng khác, tôi nghĩ mình sẽ gắn bó với 'iter()' vì: 1) nếu tôi không thêm bất kỳ hành vi bổ sung, tôi không cần nó để xuất hiện trên traceback ngoại lệ (tôi nghĩ?). 2) để tránh sử dụng toàn cục 'iter()' tôi có thể gọi 'return internal_iterable .__ iter __()'. Về điểm thứ ba bạn đã nêu ra, tôi sẽ phải suy nghĩ về điều đó có nghĩa là gì. – PeterE