哪些类型的对象属于“下标”的领域?


当前回答

作为前面答案的一个推论,这通常是一个迹象,表明你认为你有一个列表(或字典,或其他下标对象),但实际上你没有。

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

def gimme_things():
    if something_happens():
        return ['all', 'the', 'things']

现在,当您调用该函数时,something_happens()由于某种原因没有返回True值,会发生什么?如果失败了,你就失败了;gimme_things不会显式返回任何东西——所以实际上,它会隐式返回None。然后这段代码:

things = gimme_things()
print("My first thing is {0}".format(things[0]))

将会失败"NoneType object is not subscriptable"因为,好吧,things是None,所以你试图执行None[0],这没有意义,因为。错误信息的内容。

有两种方法可以修复代码中的这个错误——第一种是在尝试使用它之前,通过检查内容是否有效来避免错误;

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。如果你有一个尝试,你可以做除(TypeError, IndexError)捕获它,太。)

其他回答

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

作为前面答案的一个推论,这通常是一个迹象,表明你认为你有一个列表(或字典,或其他下标对象),但实际上你没有。

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

def gimme_things():
    if something_happens():
        return ['all', 'the', 'things']

现在,当您调用该函数时,something_happens()由于某种原因没有返回True值,会发生什么?如果失败了,你就失败了;gimme_things不会显式返回任何东西——所以实际上,它会隐式返回None。然后这段代码:

things = gimme_things()
print("My first thing is {0}".format(things[0]))

将会失败"NoneType object is not subscriptable"因为,好吧,things是None,所以你试图执行None[0],这没有意义,因为。错误信息的内容。

有两种方法可以修复代码中的这个错误——第一种是在尝试使用它之前,通过检查内容是否有效来避免错误;

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。如果你有一个尝试,你可以做除(TypeError, IndexError)捕获它,太。)

可脚本对象是记录对其进行的操作的对象,它可以将这些操作存储为可以重播的“脚本”。

例如,请参见:应用程序脚本框架

现在,如果Alistair不知道他问的是什么,真正的意思是“下标”对象(由其他人编辑),那么(正如mipadi也回答的那样)这是正确的:

下标对象是任何实现__getitem__特殊方法的对象(比如列表、字典)。

基本上,如果你在上述对象的类型转换之后修改或添加任何字段,而不是在之前修改或添加任何字段,就会出现这个错误。

在我的脑海中,以下是唯一可下标的内置:

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的答案是正确的-任何实现__getitem__的类都是可下标的