답변:
그것은 기본적으로 객체가 __getitem__()
메소드를 구현한다는 것을 의미합니다 . 즉, "컨테이너"인 객체를 설명합니다. 즉, 다른 객체를 포함합니다. 여기에는 문자열, 목록, 튜플 및 사전이 포함됩니다.
[
... ]
인덱싱 구문이 호출 첨자 는 수학적 표기 등가이기 때문에, 실제 사용하는 첨자; 예를 들어, a[1]
수학자가 a₁로 쓰는 것에 대한 파이썬입니다 . 따라서 "첨자 가능"은 "첨자 가능"을 의미합니다. 파이썬 용어로, 구문 구문 설탕 __getitem__()
이기 때문에 구현해야한다는 것을 의미합니다 . a[1]
a.__getitem__(1)
내 머리 꼭대기에서 아래는 첨자 가능한 내장 기능입니다.
string: "foobar"[3] == "b"
tuple: (1,2,3,4)[3] == 4
list: [1,2,3,4][3] == 4
dict: {"a":1, "b":2, "c":3}["c"] == 3
그러나 mipadi의 대답 은 정확합니다. 구현하는 모든 클래스 __getitem__
는 첨자 화 가능합니다.
스크립팅 가능한 객체는 수행 된 작업을 기록하는 객체이며이를 재생할 수있는 "스크립트"로 저장할 수 있습니다.
예를 들어, 응용 프로그램 스크립팅 프레임 워크를 참조하십시오.
이제 Alistair가 자신이 요청한 것을 알지 못하고 (다른 사람들이 편집 한대로) "첨자 가능한"객체를 실제로 의미 한 경우 (mipadi도 대답했듯이) 이것이 올바른 것입니다.
첨자 가능한 객체는 __getitem__
특수한 방법 (생각 목록, 사전) 을 구현하는 객체입니다 .
컴퓨팅에서 첨자의 의미는 다음과 같습니다. "배열의 요소 중 하나를 지정하기 위해 프로그램에서 단독으로 또는 다른 것으로 사용되는 기호 (일반적으로 첨자로 쓰여지지만 실제로는 일반적으로 사용되지는 않음)"
이제 @ user2194711이 제공 한 간단한 예에서 다음 두 가지 이유로 인해 추가 요소가 목록의 일부가 될 수 없음을 알 수 있습니다.
1) 우리는 실제로 메소드 add를 호출하지 않습니다. ()
전화 해야 하기 때문입니다.
2) 오류는 함수 또는 메소드가 첨자화할 수 없음을 나타냅니다. 목록이나 순서처럼 색인을 생성 할 수 없음을 의미합니다.
이제 이것을보십시오 :-
>>> var = "myString"
>>> def foo(): return 0
...
>>> var[3]
't'
>>> foo[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'function' object is not subscriptable
즉, 첨자가 없거나 function
순서대로 발생하는 것과 같은 요소를 말합니다 . 우리의 도움으로 그들처럼 액세스 할 수 없습니다 []
.
또한; mipadi 가 그의 대답에서 말한 것처럼 ; 그것은 기본적으로 객체가 __getitem__()
메소드를 구현한다는 것을 의미합니다 . (첨자 가능한 경우). 따라서 오류가 발생했습니다.
arr.append["HI"]
TypeError : 'builtin_function_or_method'개체를 첨자화할 수 없습니다
나는이 같은 문제가 있었다. 나는하고 있었다
arr = []
arr.append["HI"]
사용 중 [
오류가 발생했습니다. 그것은해야한다arr.append("HI")
이전의 답변에 대한 결론으로, 이것은 종종 당신이하지 않을 때 당신이 목록 (또는 dict 또는 다른 첨자 가능한 객체)을 가지고 있다고 생각하는 신호입니다.
예를 들어, 리스트를 반환 해야하는 함수가 있다고 가정 해 봅시다 .
def gimme_things():
if something_happens():
return ['all', 'the', 'things']
이제 해당 함수를 호출 할 때 something_happens()
어떤 이유로 True
값을 반환하지 않으면 어떻게됩니까? 은 if
당신을 통해 가을 있도록 실패하고; gimme_things
명시 적으로 return
아무것도 하지 않으므로 실제로는 암시 적으로 나타납니다 return None
. 그런 다음이 코드 :
things = gimme_things()
print("My first thing is {0}".format(things[0]))
실패합니다 " NoneType
, 때문에 아니라, 객체 것은 첨자에 아닙니다" things
입니다 None
그리고 당신이하려고 때문에 None[0]
오류 메시지가 말하는 때문에 ... 이해가되지 않는다.
코드에서이 버그를 수정하는 두 가지 방법이 있습니다. 첫 번째는 오류 things
를 사용하기 전에 실제로 유효한지 확인하여 오류를 피하는 것입니다.
things = gimme_things()
if things:
print("My first thing is {0}".format(things[0]))
else:
print("No things") # or raise an error, or do nothing, or ...
또는 동등하게 TypeError
예외를 포착하십시오 .
things = gimme_things()
try:
print("My first thing is {0}".format(things[0]))
except TypeError:
print("No things") # or raise an error, or do nothing, or ...
다른 하나는 gimme_things
항상 목록을 반환 하도록 다시 디자인 하는 것입니다. 이 경우 비슷한 디자인 일 것입니다. 비슷한 버그가있는 곳이 많으면 단순하고 관용적으로 유지할 수 있기 때문입니다.
def gimme_things():
if something_happens():
return ['all', 'the', 'things']
else: # make sure we always return a list, no matter what!
logging.info("Something didn't happen; return empty list")
return []
물론, else:
브랜치에 넣는 것은 사용 사례에 따라 다릅니다. 어쩌면 something_happens()
실패 했을 때 예외를 제기하여 실제로 잘못 된 부분을보다 명확하고 명시 적으로 만들어야합니까? 자신의 코드에 예외를 추가하는 것은 무언가 실패했을 때의 상황을 정확하게 알리는 중요한 방법입니다!
(공지 사항이 후자의 수정은 아직 완전히 버그를 수정하지 않는 방법 - 그것은 첨자를 시도하지 못하도록 None
하지만 things[0]
는 여전히 IndexError
때 things
빈 목록은 당신이있는 경우. try
당신이 할 수있는 except (TypeError, IndexError)
, 너무 트랩을합니다.)
hasattr(SomeClassWithoutGetItem, '__getitem__')
물건이 첨자 화 가능한지를 결정하는 것이 얼마나 신뢰할 만 합니까?