Явно сообщите инструменту анализа кода, что метод вернет унаследованный класс вместо базового класса

#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, примет код.
Это не влияет на фактическую среду выполнения, и код фактически будет функционировать одинаково без приведения типов.