Подсказки типа членов класса 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 также является хорошим ресурсом для подсказок типов.