Объявление типа списка Python

#python

#python

Вопрос:

Я попытался установить типы переменных в своих функциях. Когда я попытался использовать обычный тип переменной, проблем не возникло. Например,

 def myString(name:str) -> str:
    return "hello "   name
  

Однако у меня возникла проблема в списке. Во многих примерах в Интернете говорилось, что используется список, но он получил ошибку. Теперь я использую list, и ошибки нет. Можно ли это использовать?

Еще одна проблема, которую я обнаружил, что кто-то может использовать

 def myListString() -> list[str]:
    return ["ABC", "CDE"]
  

Я обнаружил ошибку.

 TypeError: 'type' object is not subscriptable
  

Как я должен это исправить?

Другая проблема, которую я обнаружил, заключается в том, что я не могу объявить MyClass в MyClass. Например,

 class Point:
    def __init__(self, x:int, y:int):
        self.x:int = x
        self.y:int = y

    def isSamePoint(self, p:Point) -> bool:
        return ((self.x==p.x) and (self.y==p.y))
p0 = Point(10, 5)
p1 = Point(5, 5)
p0.isSamePoint(p1)
  

Я обнаружил ошибку,

 def isSamePoint(self, p:Point):
NameError: name 'Point' is not defined
  

Пожалуйста, помогите мне решить проблему.

Комментарии:

1. какую версию python вы используете?

Ответ №1:

Ошибка типа: объект ‘type’ не поддается подписке

Python 3.9 допускает list[str] . Раньше вам приходилось импортировать List из typing и делать -> List[str] .

Ошибка имени: имя ‘Point’ не определено

Если вы хотите объявить тип «self», вы можете либо поместить его в строку def isSamePoint(self, p: "Point") -> bool: , либо создать интерфейс.

 >>> class A: pass
>>> class B(A): pass
>>> b = B()
>>> isinstance(b, A)
True
  

это def isSamePoint(self, p: A) помогло бы.

Кроме того, если вы хотите проверить isSamePoint , не захотите ли вы рассмотреть свой собственный __eq__ .

Ответ №2:

Чтобы объявить подсказку типа ‘self’ для Python 3.7, вам необходимо импортировать:

   from future__ import annotations
  

в начале файла. Это все, что вам нужно сделать.
Теперь вы можете использовать подсказку того же типа класса:

 def isSamePoint (self, p: Point) -> bool:
  

вместо имени класса в виде строки:

 def isSamePoint (self, p: 'Point') -> bool: