#python #class #inheritance
Вопрос:
Мой код имеет структуру, аналогичную этому сегменту кода:
class Message:
""" base class """
msg = "dummy message"
class SpecialMessage(Message):
""" inherited class """
msg = "Hello, World!"
def read_message(val) -> Message:
if val > 1:
return SpecialMessage()
return None
def read_special_message() -> SpecialMessage:
return read_message(2)
В настоящее время я использую PyCharm.
Код работает, когда я его запускаю, но PyCharm по-прежнему жалуется, что read_message возвращает сообщение вместо SpecialMessage.
В C# вы могли бы решить эту проблему, выполнив:
public Message readMessage(int val)
{
if (val > 1)
{
return SpecialMessage();
}
return null;
}
public SpecialMessage readSpecialMessage()
{
return (SpecialMessage)readMessage(2);
}
Где Сообщение-это абстрактный класс.
Есть ли аналогичная вещь, которую мы можем сделать в Python, чтобы явно указать инструменту анализа кода, что метод read_message() в этом случае должен возвращать SpecialMessage, который является унаследованным классом сообщений?
Или мне следует избегать такого рода реализации?
Изменить: Вопрос касается статического анализа, выполняемого в PyCharm, а не интерпретатора Python.
Комментарии:
1. Вам не нужно ничего говорить переводчику . Скорее, вы должны сообщить об этом инструменту статического анализа, который вы используете. Эквивалентом в Python было бы использование
typing.cast
2. @juanpa.arrivillaga Я думаю, что вы должны написать последнюю часть своего комментария в качестве ответа, показав, как использовать
typing.cast
в примере операции.
Ответ №1:
Используя typing.cast
, как предложил хуанпа.арривиллага, мы можем сделать:
import typing
...
def read_special_message() -> SpecialMessage:
return typing.cast(SpecialMessage, read_message(2))
Затем инструмент проверки статического типа, присутствующий в PyCharm, примет код.
Это не влияет на фактическую среду выполнения, и код фактически будет функционировать одинаково без приведения типов.