TypeError: объект 'type' не может быть подписан в сигнатуре функции

Почему я получаю эту ошибку при запуске этого кода?

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))

person yuenster    schedule 18.08.2020    source источник
comment
не знаком с синтаксисом, который вы используете.. вы не имеете в виду def twoSum(nums, target):?   -  person ewong    schedule 18.08.2020
comment
@евонг. Это подсказки шрифтов, и они сейчас в моде   -  person Mad Physicist    schedule 18.08.2020
comment
Этот синтаксис поддерживается только начиная с Python 3.9.   -  person Jasmijn    schedule 18.08.2020
comment
Как уже упоминалось, это будет поддерживаться в Python 3.9, но если вы хотите использовать это решение (например, list[int]) ранее, вы можете сделать это, поместив from __future__ import annotations в качестве первого импорта модуля (доступно в Python 3.7+ из-за PEP 563).   -  person Nerxis    schedule 19.04.2021


Ответы (2)


Выражение 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):
person Mad Physicist    schedule 18.08.2020
comment
list[int] должен работать с Python 3.9. - person Jürgen Strobel; 29.12.2020
comment
Типизация не использовала метаклассы начиная с версии 3.7, потому что ввод кода, использующего другой метакласс, был невозможен. Был добавлен __class_getitem__, который используется для индексации типов. Кроме того, ваш ответ совершенно неверен в Python 3.9+. - person Peilonrayz; 04.04.2021

Ответ, данный выше Mad Physicist, работает, но эта страница о новых функциях в 3.9 предполагает, что list[int] также должен работать.

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

Но это не работает для меня. Возможно, mypy еще не поддерживает эту функцию версии 3.9.

person Mark Volkmann    schedule 23.10.2020
comment
Мой код отлично работает со списком [int] в 3.9 (без ошибок времени выполнения), но все еще не правильно печатает проверку с помощью mypy. - person Jürgen Strobel; 29.12.2020