Python 对象是否“可下标”意味着什么?

2024-12-11 08:47:00
admin
原创
153
摘要:问题描述:哪些类型的对象属于“可下标”的范围?解决方案 1:它基本上意味着对象实现了该__getitem__()方法。换句话说,它描述的是“容器”对象,即它们包含其他对象。这包括字符串、列表、元组和字典。解决方案 2:据我所知,以下是唯一可下标的内置函数:string: "foobar"...

问题描述:

哪些类型的对象属于“可下标”的范围?


解决方案 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给出的简单示例中,我们可以看到附加元素不能成为列表的一部分,原因有二:-

  1. 我们实际上并没有调用方法 append; 因为它需要()调用它。

  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__()方法。(如果它是可下标的)。因此产生的错误:

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`thingstryexcept (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
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2500  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1541  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   16  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   23  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   26  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用