Python 对象是否“可下标”意味着什么?
- 2024-12-11 08:47:00
- admin 原创
- 153
问题描述:
哪些类型的对象属于“可下标”的范围?
解决方案 1:
它基本上意味着对象实现了该__getitem__()
方法。换句话说,它描述的是“容器”对象,即它们包含其他对象。这包括字符串、列表、元组和字典。
解决方案 2:
据我所知,以下是唯一可下标的内置函数:
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__
都是可下标的
解决方案 3:
下标在计算中的含义是:“在程序中单独或与其他符号一起用于指定数组元素之一的符号(名义上写为下标,但实际上通常不这样写)。”
现在,在@user2194711给出的简单示例中,我们可以看到附加元素不能成为列表的一部分,原因有二:-
我们实际上并没有调用方法 append; 因为它需要
()
调用它。该错误表明该函数或方法不可下标;意味着它们不能像列表或序列那样可索引。
现在看看这个:-
>>> 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__()
方法。(如果它是可下标的)。因此产生的错误:
arr.append["HI"]
TypeError:“builtin_function_or_method”对象不可下标
解决方案 4:
如果“可编写脚本”
可编写脚本的对象是记录对其执行的操作的对象,它可以将其存储为可重播的“脚本”。
例如,参见:应用程序脚本框架
如果“可订阅”
现在,如果 Alistair 不知道他问的是什么并且真正指的是“可下标的”对象(由其他人编辑),那么(正如 mipadi 也回答的那样)这是正确的:
可下标对象是任何实现__getitem__
特殊方法的对象(例如列表、字典)。
解决方案 5:
我也遇到了同样的问题。我当时正在
arr = []
arr.append["HI"]
因此使用[
会导致错误。应该是arr.append("HI")
解决方案 6:
作为此处先前答案的必然结果,通常这表明您认为您有一个列表(或字典或其他可下标的对象),但实际上并没有。
例如,假设您有一个应该返回列表的函数;
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
对象不可下标”,因为,嗯,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
`thingstry
except (TypeError, IndexError)`
解决方案 7:
这个问题是搜索结果中排名第一的,并且浏览量最多,所以我将在这里发布。
我的情况
(404, b'{"url":"https://example.com"}')
试图获取第一个值,访问obj[0]
返回的对象是不可下标的。
正如另一个答案所建议的那样,尝试循环它但得到的对象是不可迭代的。
解决方案
obj.args[0]
故障排除
调用print(dir(obj))
并查看是否存在可以让您访问该值的方法或属性。
解决方案 8:
基本上,如果您在对上述对象进行类型转换之后修改或添加任何字段(而不是之前进行此操作),就会出现此错误。
解决方案 9:
script_val =dict({"a":1, "b":2, "c":3})
not_script_val = 5
print(f"{hasattr(script_val,'__getitem__')=}")
print(f"{hasattr(not_script_val,'__getitem__')=}")
hasattr(script_val, '__getitem__')=True
hasattr(not_script_val, '__getitem__')=False
扫码咨询,免费领取项目管理大礼包!