- GFG
object.__getitem__
python documentation
커스텀 링크드 리스트를 만들다가 발생한 문제 브리핑.
index slicing#
s[start:end:gap]
s[:] # all
s[::-1] # backwards iteration, better than reversed()?
- [?] range 음수 갭을 주었을 때 실험해보자.
What is getitem#
아래와 같이 마지막 원소를 제외한 나머지를 순회하면서 ret
에 문자열을 끼워넣고 싶었는데 안된다고 한다. 자세히 들여다보니 __getitem__
던더함수가 없다고 나오네.
class LinkedList:
def __init__(self):
init = Node(0, None)
self.head = init
self.tail = init
self.count = 0
# ... 중략
def __str__(self):
cur = self.head.next
ret = "[ "
for elem in self[0:-1]:
ret += str(elem) + ", "
ret += " ]"
return ret
__str__
메서드 안에 self[0:-1]
구문에서 문제가 터지고 말았다.
두 브라켓 사이에 별에 별 걸 다 집어넣어본 경험이 있는 우리는... 이제 그 실체를 마주할 때가 되었다.
Note that the special interpretation of negative indexes (if the class wishes to emulate a sequence type) is up to the
__getitem__()
method
- 음수 인덱스
- 슬라이스 객체
- 문자열 (매핑을 위하여)
- 임의의 객체
Implementing getitem#
그래서, 임의의 타입을 일일이 isinstance
를 찍어가면서 해야한단 거야? => No! SOF - use exception handling!
slice 타입을 어떻게 처리하지? slice.indices - python
빙챗한테 __getitem__
어떻게 구현하냐고 물어봤다. 굉장히 만족스러운 답변을 내놓았다.
The __getitem__
method receives a slice object when the object is sliced. You can look at the start
, stop
, and step
members of the slice object to get the components for the slice¹.
Here's an example implementation of __getitem__
that handles both indexing and slicing:
class MyClass:
def __init__(self, data):
self.data = data
def __getitem__(self, index):
# 아래 보면 `isinstance`를 사용하는게 가독성에 더 좋을지도
if isinstance(index, slice):
start, stop, step = index.indices(len(self.data))
return [self.data[i] for i in range(start, stop, step)]
else:
return self.data[index]
This implementation checks if the index
parameter passed to __getitem__
is a slice object. If it is, it uses the indices
method of the slice object to get the start, stop and step values for the slice. It then uses a list comprehension to return a new list containing the sliced data. If index
is not a slice object, it simply returns the element at that index in the data.
Source: Conversation with Bing, 5/17/2023
(1) python - Implementing slicing in getitem - Stack Overflow. https://stackoverflow.com/questions/2936863/implementing-slicing-in-getitem.
(2) 3. Data model — Python 3.11.3 documentation. https://docs.python.org/3/reference/datamodel.html.
(3) Implementing slicing in getitem - GeeksforGeeks. https://www.geeksforgeeks.org/implementing-slicing-in-__getitem__/.
(4) Fix Python – Implementing slicing in getitem. https://fixpython.com/2022/11/fix-python-implementing-slicing-in-getitem-po1tjgr/.