Какие типы объектов попадают в область "индексируемого"?
Что это значит, если объект является подписным или нет?
Ответ 1
В основном это означает, что объект реализует метод __getitem__(). Другими словами, он описывает объекты, которые являются "контейнерами", то есть они содержат другие объекты. Сюда входят списки, кортежи и словари.
Ответ 2
В верхней части моей головы находятся следующие встроенные модули:
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 answer является правильным - любой класс, который реализует __getitem__, подлежит расшифровке
Ответ 3
Объект, доступный для сценариев, является объектом, который записывает выполняемые ему операции, и может хранить их как "script", которые могут быть воспроизведены.
Например, см. Application Scripting Framework
Теперь, если Алистер не знал, что он спросил, и действительно имел в виду "индексируемые" объекты (как отредактировано другими), тогда (как ответил мипади) это правильный:
Подследуемый объект - это любой объект, который реализует специальный метод __getitem__ (мыслительные списки, словари).
Ответ 4
Значение индекса в вычислениях: "символ (условно записанный как индекс, но на практике обычно нет), используемый в программе, один или с другими, для указания одного из элементов массива".
Теперь в простом примере, представленном @user2194711, мы видим, что добавляемый элемент не может быть частью списка по двум причинам:
1) Мы не вызываем метод append; потому что это нужно () чтобы вызвать его.
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 нет индексов или, скажем, элементов, как они встречаются в последовательностях; и мы не можем получить к ним доступ, как мы, с помощью [].
Также; как сказал Мипади в своем ответе; В основном это означает, что объект реализует метод __getitem__(). (если это по подписке). Таким образом, ошибка выдает:
arr.append["HI"]
Ошибка типа: объект "builtin_function_or_method" не может быть подписан
Ответ 5
У меня была такая же проблема. Я делал
arr = []
arr.append["HI"]
Таким образом, использование [ вызывало ошибку. Это должно быть arr.append("HI")
Ответ 6
Как следствие предыдущих ответов здесь, очень часто это признак того, что вы думаете, что у вас есть список (или 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 объекта не subscriptable", потому что, ну, 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 дизайн 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() не работает, чтобы сделать это более очевидным и явным, если что-то действительно пошло не так? Добавление исключений в ваш собственный код - это важный способ сообщить себе, что происходит, когда что-то не работает!
(Обратите также внимание, что это последнее исправление по-прежнему не полностью исправляет ошибку - оно не позволяет вам пытаться IndexError None но IndexError things[0] по-прежнему является IndexError когда things являются пустым списком. Если у вас есть try вы можете сделать, except (TypeError, IndexError) чтобы перехватить это тоже.)