#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: