Відповіді:
Це в основному означає, що об'єкт реалізує __getitem__()
метод. Іншими словами, він описує об'єкти, які є "контейнерами", тобто вони містять інші об'єкти. Сюди входять рядки, списки, кортежі та словники.
[
... ]
індексувати синтаксис називається індексом , тому що це рівносильно математичного запису , яка використовує фактичні індекси; наприклад a[1]
, Python для того, що математики писали б як a₁ . Отже, "підписується" означає "можливість підписатися". Що, з точки зору Python, означає, що воно має реалізовуватися __getitem__()
, оскільки a[1]
це просто синтаксичний цукор для a.__getitem__(1)
.
hasattr
повинен працювати добре, але це не піфонічний спосіб робити речі; Практика пітона заохочує друкувати качок . Тобто, якщо ви плануєте спробувати витягнути предмет з вашого об'єкта за допомогою підписника, продовжуйте робити це; якщо ви думаєте, що він може не працювати, оскільки об’єкт не піддається підключенню, оберніть його в try
блок із символом except TypeError
.
Об'єкт сценарію - це об'єкт, який записує виконані ним операції, і він може зберігати їх як "сценарій", який можна відтворити.
Наприклад, див .: Рамка сценаріїв додатків
Тепер, якщо Алістер не знав, про що він запитував, і справді мав на увазі "передплачувані" об'єкти (як редагували інші), то (як мипаді також відповів) це правильний варіант:
Об'єкт, що підписується - це будь-який об’єкт, який реалізує __getitem__
спеціальний метод (списки розслідувань, словники).
Сенс індексу в обчислювальних технологіях полягає в тому, що "символ (умовно написаний як підпис, але на практиці зазвичай не використовується), який використовується в програмі самостійно або з іншими, щоб вказати один з елементів масиву".
Тепер, у простому прикладі, поданому від @ user2194711, ми бачимо, що додаючий елемент не може бути частиною списку через дві причини: -
1) метод насправді не викликає додавання; тому що його потрібно ()
називати.
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: об’єкт 'izgrain__function_or_method' не піддається підключенню
У мене був цей самий випуск. я робив
arr = []
arr.append["HI"]
Тож використання [
викликало помилки. Вона повинна бутиarr.append("HI")
Як наслідок попередніх відповідей тут, дуже часто це знак того, що ви вважаєте, що у вас є список (або диктант, або інший об'єкт, який можна підписати), коли цього немає.
Наприклад, скажімо, у вас є функція, яка повинна повертати список;
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
так, щоб переконатися, що вона завжди повертає список. У цьому випадку це, мабуть, простіша конструкція, оскільки це означає, що якщо у вас є багато місць, де у вас є схожа помилка, їх можна зберігати просто і безглуздо.
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__')
визначити, чи можна підписати річ?