Проверка PyCharm не показывает предупреждения для моего собственного класса в аннотациях типа

Вот мой код. Оно работает. Обратите внимание на линии А и В.

from dataclasses import dataclass, field, InitVar
import datetime
from typing import List, Optional

@dataclass
class Book:
    author: str = 'no data'
    title: str = 'no data'

@dataclass
class Library:
    name: str = 'no data'
    books: List[Book] = field(default_factory=list)  # line A - books attribute type annotation
    gen_time: InitVar[bool] = True
    creation_timestamp: Optional[str] = None

    def __post_init__(self, gen_time):
        if gen_time:
            self.creation_timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

def main():

    b_1 = Book('J. Mouse', 'Beautiful mice')
    b_2 = Book('M. Catling', 'Magic kittens')
    b_3 = Book('A. Dogg', 'Tasty Dogs')
    print(b_1, b_2, b_3)

    bb_1 = Library('My library', gen_time=False)
    bb_1.books.extend([bb_1, b_2, b_3, 1])  # line B - add books and not books to newly created empty library
    print(bb_1)


if __name__ == '__main__':
    main()

Строка A говорит, что атрибут books должен быть списком, содержащим Book объектов. В строке B я добавляю Book, Library и int к books. PyCharm не сообщает мне, является ли это проблемой.

Однако, если я немного изменю строку A books: List[str] = field(default_factory=list) (Book ‹-> str), PyCharm выдаст следующее очень полезное предупреждение:

Ожидаемый тип «Iterable[str]» (соответствует общему типу «Iterable[_T]»), вместо этого получен «List[Union[Library, Book, int]]»

Итак, почему проверка PyCharm ведет себя по-разному в этих двух случаях? Как я могу увидеть предупреждение с исходным кодом?

P.S. Win10/Python 3.7/PyCharm Community Edition 2019.2 без каких-либо модификаций/дополнений.


person Poolka    schedule 05.08.2019    source источник


Ответы (1)


Предполагаемый тип [bb_1, b_2, b_3, 1] — это List[Union[Library, Book, int]], и он соответствует ожидаемому типу следующим образом:

  1. Типы контейнеров одинаковые, List в обоих случаях
  2. Фактический тип значения Union[Library, Book, int] содержит ожидаемый тип Book -- здесь проверка типов удовлетворена и ничего не говорит.

Это ошибка в системе типов PyCharm.

person user2235698    schedule 18.09.2019
comment
Спасибо за объяснение. Надеюсь, ошибка будет исправлена. На данный момент я думаю, что мне следует использовать другую программу проверки вместе с PyCharm. В случае, если я забочусь. - person Poolka; 19.09.2019