Какие типы объектов попадают в область «подписки»?
python
terminology
Alistair
источник
источник
hasattr(SomeClassWithoutGetItem, '__getitem__')
определить, является ли вещь подписной?[
...]
индексировать синтаксис называется индексом , потому что это равносильно математической записи , которая использует фактические индексы; Напримерa[1]
, Python для того, что математики написали бы как ₁ . Таким образом, «подписной» означает «может быть подписан». Что, в терминах Python, означает, что он должен быть реализован__getitem__()
, посколькуa[1]
является просто синтаксическим сахаром дляa.__getitem__(1)
.hasattr
должен работать хорошо, но это не Pythonic способ делать вещи; Практика Python поощряет Duck Typing . Это означает, что если вы планируете попытаться получить элемент из вашего объекта с помощью индекса, продолжайте и сделайте это; если вы думаете, что это может не сработать, потому что объект не может быть подписан, поместите его вtry
блок с помощьюexcept TypeError
.Вдобавок к моей голове, следующие единственные встроенные модули, которые могут быть подписаны:
Но ответ Mipadi является правильным - любой класс, который реализует
__getitem__
является подписнымисточник
Объект сценариев - это объект, который записывает выполненные с ним операции и может сохранять их как «сценарий», который можно воспроизвести.
Например, см .: Application Scripting Framework
Теперь, если Алистер не знал, о чем он спрашивал, и действительно имел в виду «подписываемые» объекты (отредактированные другими), то (как ответил и Мипади) это будет правильным:
Подписываемый объект - это любой объект, который реализует
__getitem__
специальный метод (списки рассуждений, словари).источник
Значение индекса в вычислениях: «символ (условно записанный как индекс, но на практике обычно нет), используемый в программе, один или с другими, для указания одного из элементов массива».
Теперь в простом примере, приведенном @ user2194711 мы видим, что добавляемый элемент не может быть частью списка по двум причинам:
1) Мы не вызываем метод append; потому что это нужно
()
назвать это.2) ошибка указывает на то, что функция или метод не могут быть подписаны; означает, что они не индексируются как список или последовательность.
Теперь посмотри:
Это означает, что в
function
виде, в они встречаются в последовательностях; и мы не можем получить к ним доступ, как мы, с помощью[]
.Также; как сказал Мипади в своем ответе; Это в основном означает, что объект реализует
__getitem__()
метод. (если это по подписке). Таким образом, ошибка выдает:источник
У меня была такая же проблема. я делал
Таким образом, использование
[
было причиной ошибки. Должен бытьarr.append("HI")
источник
Как следствие предыдущих ответов здесь, очень часто это признак того, что вы думаете, что у вас есть список (или dict, или другой подписываемый объект), когда у вас его нет.
Например, допустим, у вас есть функция, которая должна возвращать список;
Теперь, когда вы вызываете эту функцию и
something_happens()
по какой-то причине не возвращаетеTrue
значение, что происходит?if
Не удается, и поэтому вы провалитесь;gimme_things
ничего явноreturn
не значит - так что на самом деле, это будет неявноreturn None
. Тогда этот код:потерпит неудачу с «
NoneType
объект не подписывается», потому что, ну,things
этоNone
и так вы пытаетесь сделатьNone[0]
, что не имеет смысла , потому что ... что говорит сообщение об ошибке.Есть два способа исправить эту ошибку в вашем коде: во-первых, чтобы избежать ошибки, проверьте,
things
действительно ли она действительна, прежде чем пытаться ее использовать;или эквивалентно заманить
TypeError
исключение в ловушкуДругой -
gimme_things
изменить дизайн так, чтобы он всегда возвращал список. В этом случае, вероятно, это более простой дизайн, потому что это означает, что если во многих местах есть похожая ошибка, они могут быть простыми и идиоматичными.Конечно, то, что вы положите в
else:
ветку, зависит от вашего варианта использования. Возможно, вам следует поднять исключение, когдаsomething_happens()
неудачи, чтобы сделать его более очевидным и явным, если что-то пошло не так? Добавление исключений в ваш собственный код - это важный способ, позволяющий точно знать, что происходит, когда что-то не работает!(Обратите также внимание на то, что это последнее исправление все еще не полностью исправляет ошибку - оно предотвращает попытки подстрочного индекса,
None
ноthings[0]
по-прежнему является пустым списком,IndexError
когдаthings
есть. Если у вас есть,try
вы также можете егоexcept (TypeError, IndexError)
перехватить.)источник