Вот мой код. Оно работает. Обратите внимание на линии А и В.
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 без каких-либо модификаций/дополнений.