mip*_*adi 298

它基本上意味着该对象实现了该__getitem__()方法.换句话说,它描述了作为"容器"的对象,这意味着它们包含其他对象.这包括列表,元组和词典.

  • `[`...`]` 索引语法称为_下标_,因为它相当于使用实际下标的数学符号;例如 `a[1]` 是 Python,数学家会写成 **a₁**。所以“可下标”的意思是“能够被下标”。用Python术语来说,这意味着它必须实现`__getitem__()`,因为`a[1]`只是`a.__getitem__(1)`的语法糖。 (12认同)
  • 确定某个事物是否可下标的“hasattr(SomeClassWithoutGetItem, '__getitem__')”有多可靠? (2认同)

Dan*_*Dan 70

在我的脑海中,以下是唯一可订阅的内置插件:

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
Run Code Online (Sandbox Code Playgroud)

但是mipadi的答案是正确的 - 任何实现的类__getitem__都是可订阅的


tzo*_*zot 15

可编写脚本的对象是一个记录对其执行的操作的对象,它可以将它们存储为可以重放的"脚本".

例如,请参阅:Application Scripting Framework

现在,如果Alistair不知道他问的是什么并且真正意味着"可订阅的"对象(由其他人编辑),那么(正如mipadi也回答)这是正确的:

可订阅对象是实现__getitem__特殊方法的任何对象(思考列表,字典).

  • 请注意,我正在回答有关"可编写脚本"对象的原始问题,而不是其他人编辑的"可订阅",而不是Alistair.我真的希望阿利斯泰尔发表评论. (2认同)

Vic*_*bot 13

计算中下标的含义是:"一个符号(在概念上写成,但在实践中通常不是),在程序中单独使用或与其他程序一起使用,以指定数组的一个元素."

现在,在@ 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
Run Code Online (Sandbox Code Playgroud)

这意味着没有下标或说出function序列中出现的元素; 在我们的帮助下,我们无法像我们一样访问它们[].

也; 正如米帕迪在回答中说的那样; 它基本上意味着该对象实现了该__getitem__()方法.(如果是可订阅的).因此产生的错误:

arr.append["HI"]
Run Code Online (Sandbox Code Playgroud)

TypeError:'builtin_function_or_method'对象不可订阅


小智 7

我有同样的问题.我在做

arr = []
arr.append["HI"]
Run Code Online (Sandbox Code Playgroud)

因此使用[导致错误.它应该是arr.append("HI")


tri*_*eee 5

作为此处早期答案的推论,这通常表明您认为您有一个列表(或 dict,或其他可下标的对象),而实际上您没有。

例如,假设您有一个应该返回列表的函数;

def gimme_things():
    if something_happens():
        return ['all', 'the', 'things']
Run Code Online (Sandbox Code Playgroud)

现在,当您调用该函数时,something_happens()由于某种原因没有返回True值,会发生什么?的if失败,这样你就告吹; gimme_things没有明确的return任何东西——所以实际上,它会隐含地return None。然后这段代码:

things = gimme_things()
print("My first thing is {0}".format(things[0]))
Run Code Online (Sandbox Code Playgroud)

将因“NoneType对象不可下标”而失败,因为thingsNone这样,所以您正在尝试这样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 ...
Run Code Online (Sandbox Code Playgroud)

或等效地捕获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 ...
Run Code Online (Sandbox Code Playgroud)

另一种方法是重新设计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 []
Run Code Online (Sandbox Code Playgroud)

当然,您在else:分支中放置的内容取决于您的用例。也许您应该在something_happens()失败时引发异常,以便更明显和明确地指出实际出错的地方?在您自己的代码中添加异常是让自己确切知道发生故障时发生了什么的重要方式!

(还要注意如何修复后仍不能完全解决的bug -它阻止你尝试下标None,但things[0]仍然是一个IndexErrorthings空列表如果你有,try你可以except (TypeError, IndexError)捕获它,太。)