Что в Python означает, является ли объект подписываемым или нет? - PullRequest
274 голосов
/ 20 октября 2008

Какие типы объектов попадают в область «подписки»?

Ответы [ 5 ]

251 голосов
/ 20 октября 2008

Это в основном означает, что объект реализует метод __getitem__(). Другими словами, он описывает объекты, которые являются «контейнерами», то есть они содержат другие объекты. Сюда входят списки, кортежи и словари.

58 голосов
/ 20 октября 2008

Вне моей головы, следующие единственные встроенные модули, которые являются допустимыми:

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

Но ответ Мипади правильный - любой класс, который реализует __getitem__, может быть подписан

15 голосов
/ 20 октября 2008

Объект сценариев - это объект, который записывает выполненные с ним операции и может сохранять их как «сценарий», который можно воспроизвести.

Например, см .: Application Scripting Framework

Теперь, если Алистер не знал, о чем он спрашивал, и действительно имел в виду «подписываемые» объекты (отредактированные другими), то (как ответил и Мипади) это правильный:

Подписываемый объект - это любой объект, который реализует специальный метод __getitem__ (списки рассуждений, словари).

10 голосов
/ 31 марта 2018

Значение индекса в вычислениях: «символ (условно записанный как индекс, но на практике обычно нет), используемый в программе, один или с другими, для указания одного из элементов массива».

Теперь в простом примере, приведенном @ 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"]

TypeError: объект builtin_function_or_method не может быть подписан

7 голосов
/ 23 ноября 2016

У меня была такая же проблема. Я делал

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

Таким образом, использование [ вызывало ошибку. Это должно быть arr.append("HI")

...