파이썬 객체가“첨자 가능”여부는 무엇을 의미합니까?


답변:


356

그것은 기본적으로 객체가 __getitem__()메소드를 구현한다는 것을 의미합니다 . 즉, "컨테이너"인 객체를 설명합니다. 즉, 다른 객체를 포함합니다. 여기에는 문자열, 목록, 튜플 및 사전이 포함됩니다.


2
hasattr(SomeClassWithoutGetItem, '__getitem__')물건이 첨자 화 가능한지를 결정하는 것이 얼마나 신뢰할 만 합니까?
jmunsch

2
[... ]인덱싱 구문이 호출 첨자 는 수학적 표기 등가이기 때문에, 실제 사용하는 첨자; 예를 들어, a[1]수학자가 a₁로 쓰는 것에 대한 파이썬입니다 . 따라서 "첨자 가능"은 "첨자 가능"을 의미합니다. 파이썬 용어로, 구문 구문 설탕 __getitem__()이기 때문에 구현해야한다는 것을 의미합니다 . a[1]a.__getitem__(1)
Mark Reed

그 호출 hasattr은 잘 작동해야하지만, 일을하는 것은 Pythonic 방법이 아닙니다. 파이썬 연습은 오리 타이핑을 권장 합니다. 즉, 아래 첨자를 사용하여 객체에서 항목을 가져 오려는 경우 계속 진행하십시오. 개체를 첨자화할 수 없어서 작동하지 않을 수 있다고 생각되면을 사용하여 try블록으로 감싸십시오 except TypeError.
Mark Reed

77

내 머리 꼭대기에서 아래는 첨자 가능한 내장 기능입니다.

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__는 첨자 화 가능합니다.


17

스크립팅 가능한 객체는 수행 된 작업을 기록하는 객체이며이를 재생할 수있는 "스크립트"로 저장할 수 있습니다.

예를 들어, 응용 프로그램 스크립팅 프레임 워크를 참조하십시오.

이제 Alistair가 자신이 요청한 것을 알지 못하고 (다른 사람들이 편집 한대로) "첨자 가능한"객체를 실제로 의미 한 경우 (mipadi도 대답했듯이) 이것이 올바른 것입니다.

첨자 가능한 객체는 __getitem__특수한 방법 (생각 목록, 사전) 을 구현하는 객체입니다 .


2
Alistair가 아닌 다른 사람들이 편집 한 것처럼 "첨자 가능"이 아닌 "스크립트 가능"개체에 대한 원래 질문에 답하고 있습니다. 나는 Alistair가 논평하고 싶습니다.
tzot

아, 내 컬렉션의 새로운 배지! :) 농담이다. 질문의 편집을 정당화 한 유일한 것은 Alistair가 답을 선택했다는 것입니다. Alistair가 선택에 대해 확신했는지 여전히 확실하지 않습니다.
tzot

16

컴퓨팅에서 첨자의 의미는 다음과 같습니다. "배열의 요소 중 하나를 지정하기 위해 프로그램에서 단독으로 또는 다른 것으로 사용되는 기호 (일반적으로 첨자로 쓰여지지만 실제로는 일반적으로 사용되지는 않음)"

이제 @ 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'개체를 첨자화할 수 없습니다


7

나는이 같은 문제가 있었다. 나는하고 있었다

arr = []
arr.append["HI"]

사용 중 [오류가 발생했습니다. 그것은해야한다arr.append("HI")


3

이전의 답변에 대한 결론으로, 이것은 종종 당신이하지 않을 때 당신이 목록 (또는 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]는 여전히 IndexErrorthings빈 목록은 당신이있는 경우. try당신이 할 수있는 except (TypeError, IndexError), 너무 트랩을합니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.