函数签名中出现“TypeError:‘type’对象不可下标”

2025-03-12 08:52:00
admin
原创
37
摘要:问题描述:为什么我运行此代码时会收到此错误?Traceback (most recent call last): ...

问题描述:

为什么我运行此代码时会收到此错误?

Traceback (most recent call last):                                                                                                                                                  
  File "main.py", line 13, in <module>                                                                                                                                              
    def twoSum(self, nums: list[int], target: int) -> list[int]:                                                                                                                    
TypeError: 'type' object is not subscriptable
nums = [4,5,6,7,8,9]
target = 13

def twoSum(self, nums: list[int], target: int) -> list[int]:
        dictionary = {}
        answer = []
 
        for i in range(len(nums)):
            secondNumber = target-nums[i]
            if(secondNumber in dictionary.keys()):
                secondIndex = nums.index(secondNumber)
                if(i != secondIndex):
                    return sorted([i, secondIndex])
                
            dictionary.update({nums[i]: i})

print(twoSum(nums, target))

解决方案 1:

以下答案仅适用于 Python < 3.9

表达式list[int]试图对对象 进行下标list,该对象是一个类。类对象属于其元类的类型,type在本例中为 。由于type未定义__getitem__方法,因此您无法执行list[...]

为了正确执行此操作,您需要导入typing.List并使用它,而不是在类型提示中使用内置功能list

from typing import List

...


def twoSum(self, nums: List[int], target: int) -> List[int]:

如果您想避免额外的导入,您可以简化类型提示以排除泛型:

def twoSum(self, nums: list, target: int) -> list:

或者,你可以完全摆脱类型提示:

def twoSum(self, nums, target):

解决方案 2:

将@Nerxis 的评论转化为答案。

对于 Python 3.7 和 3.8,添加:

from __future__ import annotations

作为您第一次导入到模块中。

List虽然使用代替的答案list是可以的,但是当您需要执行 时它不会帮助您pd.Series[np.int64]。请改用上面的方法。

解决方案 3:

概括

代码中说的部分-> list[int]是函数返回类型的类型注释。这是一种特殊的符号,第三方工具可以使用它来对代码进行一些基本的静态类型检查。就 Python 本身而言,它对代码的唯一影响是向函数添加一些元数据:

>>> def example() -> list[int]:
...     pass
... 
>>> 'return' in example.__annotations__
True

Python 本身不会进行任何类型检查:

>>> type(example()) # definitely did not give a list of integers!
<class 'NoneType'>

类似地,部分是 的参数: list[int]的类型注释。nums`twoSum`

根据 Python 版本的不同,此特定的注释可能不被接受。

Python 3.9 及更高版本

该错误无法重现。-> list[int]声明该函数旨在返回包含所有整数值的列表,并: list[int]声明应为传入另一个这样的列表nums。这些提示允许第三方工具(如 MyPy)在编译或运行代码之前查找问题。

Python 3.7 或 3.8

此注释不按原样接受。有两种解决方法:

  1. 使用导入来访问PEP 563__future__中描述的“推迟评估注释”行为:

# At the top of the code, along with the other `import`s
from __future__ import annotations
  1. 使用标准库模块中定义的相应类typing

# At the top of the code
from typing import List

# when annotating the function
def twoSum(self, nums: List[int], target: int) -> List[int]:

注意 中的大写ListL。

Python 3.5 和 3.6

__future__不支持该注释。请使用typing模块。

Python 3.4 及更低版本

根本不支持类型注释。只需将其删除即可:

def twoSum(self, nums, target):

再次提醒,请记住Python 本身不会对注释做任何有意义的事情。它们不会导致代码因无效参数而引发异常,将它们转换为正确的类型,或执行其他任何类似操作。它们适用于第三方工具,并且完全是可选的,除非其他第三方工具强制使用它们。

解决方案 4:

上面“疯狂物理学家”给出的答案有效,但是这个关于 3.9 新功能的页面表明“list[int]”也应该有效。

https://docs.python.org/3/whatsnew/3.9.html

但是对我来说不起作用。也许mypy还不支持3.9的这个功能。

解决方案 5:

我在通过 执行 Python 脚本时遇到了类似的问题python -m <package>.<module>。我可以通过从 PowerShell 切换到 cmd 来避免这个问题。这可能是因为 PowerShell 使用的 Python 版本与我的 cmd 不同,我无法检查。(Windows 10 + Python 3.10)

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1887  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1425  
  在制造业数字化转型的进程中,PLM(产品生命周期管理)系统、ERP(企业资源计划)系统、MES(制造执行系统)以及 CAD(计算机辅助设计)软件都扮演着至关重要的角色。然而,这些系统和软件各自独立运行时,往往难以发挥出最大的协同效应。实现 PLM 系统与 ERP、MES、CAD 的有效集成,成为提升企业整体竞争力、优化...
plm系统的主要功能模块   3  
  产品生命周期管理(PLM)作为一种先进的管理理念和技术,在电子与半导体行业正发挥着日益重要的作用。随着电子与半导体行业的快速发展,产品更新换代速度加快,市场竞争愈发激烈,企业面临着诸多挑战,如缩短产品上市时间、提高产品质量、降低成本等。而PLM的应用为企业应对这些挑战提供了有效的解决方案,展现出巨大的应用价值。提升产品...
plm项目   4  
  PLM(产品生命周期管理)项目管理软件在现代企业的产品研发、生产与运营中扮演着至关重要的角色。它整合了从产品概念设计到退役的全流程数据与流程,助力企业提升效率、降低成本并增强创新能力。随着科技的飞速发展以及企业需求的不断演变,未来十年 PLM 项目管理软件的发展充满了无限可能,值得深入探讨与预测。智能化与自动化趋势智能...
plm产品全生命周期管理   6  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用