Trong Python, khi triển khai một loại chuỗi, tôi thường (tương đối nói) thấy mình viết code như thế này:Làm thế nào để viết __getitem__ sạch?
class FooSequence(collections.abc.Sequence):
# Snip other methods
def __getitem__(self, key):
if isinstance(key, int):
# Get a single item
elif isinstance(key, slice):
# Get a whole slice
else:
raise TypeError('Index must be int, not {}'.format(type(key).__name__))
Mã kiểm tra các loại đối số của nó một cách rõ ràng với isinstance()
. Đây là regarded as an antipattern trong cộng đồng Python. Làm thế nào để tránh nó?
- tôi không thể sử dụng
functools.singledispatch
, bởi vì đó là quite deliberately không tương thích với các phương pháp (nó sẽ cố gắng để gửi vềself
, đó là hoàn toàn vô dụng vì chúng ta đang đã cử trênself
qua OOP polymorphism). Nó hoạt động với@staticmethod
, nhưng nếu tôi cần lấy đồ ra khỏi sốself
thì sao? - Truyền tới
int()
và sau đó bắt cácTypeError
, kiểm tra một lát và có thể nâng cấp lại vẫn xấu xí, mặc dù có lẽ hơi kém hơn. - Nó có thể sạch hơn để chuyển đổi số nguyên thành lát một phần tử và xử lý cả hai tình huống với cùng mã, nhưng có vấn đề riêng (trả lại
0
hoặc[0]
?).
Tất nhiên, ngôn ngữ * đã sử dụng * để làm điều này cho chúng tôi với '__getslice__', nhưng điều đó không được chấp nhận, điều này khiến tôi băn khoăn về tính chính xác của toàn bộ kỹ thuật. – Kevin
@Kevin, nó không được chấp nhận vì các lý do khác nhau. Họ muốn tạo một đối tượng 'slice', nhưng' __getslice__' nhận các đối số 'i' và' j'. Nó sẽ có khả năng tương thích ngược. –