Как я могу ввести атрибут hint в Python 3.5?

#python #attributes #type-hinting

#python #атрибуты #тип-подсказка

Вопрос:

У меня есть класс, в котором я хочу, чтобы начальное значение атрибута было None :

 class SomeClass:
    def __init__(self):
        self.some_attribute = None
  

Как я могу добавить подсказку типа, чтобы IDE понимала, что some_attribute обычно имеет этот тип AnotherClass ?

Ответ №1:

В Python 3.5 вы должны написать

 self.some_attribute = None  # type: AnotherClass
  

Начиная с Python 3.6, для переменных был добавлен новый синтаксис подсказки типа (PEP 526):

 self.some_attribute: AnotherClass = None
  

Это, вероятно, заставит жаловаться каждую систему проверки типов, потому что None фактически не является экземпляром AnotherClass. Вместо этого вы можете использовать typing.Union[None, AnotherClass] , или сокращение:

 from typing import Optional
...
self.some_attribute: Optional[AnotherClass] = None
  

Ответ №2:

Python 3.10 использует знак канала, | который многие языки используют в качестве оператора or (PEP 604) для обозначения Typing.Union .

Итак…

self.some_attribute: AnotherClass|None = None

Более лаконично, Typing импорт не требуется.

FWIW, обычно 3.10 также устраняет многие встроенные контейнеры, требующие ввода imports: list[int] , not List[int] (что все еще работает).

Примечание: если по-прежнему требуется использование прямых объявлений Optional["AnotherClass"] , канал не работает.

Также канал обрабатывает больше, чем None, поскольку это сокращение для Typing.Union :

some_attribute: AnotherClass|YetAnotherClass