Подсказки типа членов класса Python

Я использую PyCharm разработать приложение на Python. Я пытаюсь использовать как можно более современный Python, поэтому я использую новые возможности Python. У меня проблема с type hinting,

Давайте все посмотрим на мой DataAnalyzer учебный класс:

class DataAnalyzer:

    def __init__(self, train_data: pd.DataFrame, test_data: pd.DataFrame) -> None:
        self.train_data = train_data
        self.test_data = test_data

    def analyze(self):
        pass

Теперь PyCharm спамит меня желтыми лампочками, желая, чтобы я добавил аннотации к self.train_data а также self.test_data, Если я нажму на это сообщение, PyCharm добавит две строки в начале моего класса:

class DataAnalyzer:
    train_data: pd.DataFrame
    test_data: pd.DataFrame

    def __init__(self, train_data: pd.DataFrame, test_data: pd.DataFrame) -> None:
        self.train_data = train_data
        self.test_data = test_data

    def analyze(self):
        pass

Я думаю, теперь это выглядит лучше, но AFAIK, записывая эти переменные, я делаю их статичными.

Я думал об аннотировании типов как это:

class DataAnalyzer:

    def __init__(self, train_data: pd.DataFrame, test_data: pd.DataFrame) -> None:
        self.train_data: pd.DataFrame = train_data
        self.test_data: pd.DataFrame = test_data

    def analyze(self):
        pass

Что, безусловно, не ясно, но я не делаю своих учеников статичными, когда я этого не хочу.

Я знаю, что аннотирование типов в сигнатуре метода, повторение этого, когда я просто назначаю их, является излишним, но я спрашиваю общее правило. Должен ли я аннотировать те типы, которые PyCharm предлагает мне, или я должен сделать это встроенным?

0 ответов

Предложение PyCharm верно. На самом деле, я считаю, что следующий код лучше:

class DataAnalyzer:
    train_data: pd.DataFrame
    test_data: pd.DataFrame

    def __init__(self, train_data, test_data):
        self.train_data = train_data
        self.test_data = test_data

    def analyze(self):
        pass

Объясните:

  • Аннотирование члена не делает его статичным.
  • Мы не должны аннотировать аргументы в __init__ снова работать.
  • -> None после __init__можно не указывать. За__init__ никогда не возвращать значение.

Спасибо.

Оба варианта действительны - проверьте pep 526

Аннотации типов также могут использоваться для аннотирования переменных класса и экземпляра в телах и методах классов. В частности, беззначная записьa: int позволяет аннотировать переменные экземпляра, которые должны быть инициализированы в __init__ или __new__.

Документация MyPy также является хорошим ресурсом для подсказок типов.

Другие вопросы по тегам