在Python中,如果一个对象是可订阅的,它意味着什么?

时间:2008-10-19 21:08:24

标签: python terminology

哪些类型的对象属于“可订阅”域?

6 个答案:

答案 0 :(得分:251)

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

答案 1 :(得分:58)

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

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's answer是正确的 - 任何实现__getitem__的类都是可订阅的

答案 2 :(得分:15)

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

例如,请参阅:Application Scripting Framework

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

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

答案 3 :(得分:9)

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

现在,在@user2194711给出的简单示例中,我们可以看到附加元素不能成为列表的一部分,原因有两个: -

1)我们并没有真正调用方法追加;因为它需要NameScope.SetNameScope(myContextMenu, this); 来调用它。

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的帮助下,我们无法像我们一样访问它们。

也;正如mipadi在他的回答中所说;它基本上意味着该对象实现了[]方法。 (如果是可订阅的)。 因此产生了错误:

__getitem__()
  

TypeError:'builtin_function_or_method'对象不可订阅

答案 4 :(得分:7)

我有同样的问题。我在做什么

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

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

答案 5 :(得分:0)

作为此处先前答案的推论,通常这表明您认为自己拥有列表(或字典或其他可下标对象),而您却没有列表。

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

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对象不可下标”,因为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 ...

或等效地捕获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下标,但是当{{1时,things[0]仍然是IndexError }}是一个空列表。如果您有things,也可以进行try对其进行陷阱。)