PyCharm 检查在类型注释中不显示我自己的类的警告



这是我的代码。它有效。注意A线和B线。

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 行中,我将BookLibraryint 添加到 books 中。PyCharm没有告诉我这是否是一个问题。

但是,如果我稍微books: List[str] = field(default_factory=list)修改行 A (Book <->str(,那么 PyCharm 会给出以下非常有用的警告:

预期类型"可迭代[

str]"(匹配的泛型类型"可迭代[_T]"(, 得到"列表[联盟[图书馆,书籍,int]]"代替

那么,为什么 PyCharm 检测在这两种情况下的行为不同呢?如何查看带有原始代码的警告?

P.S. Win10/Python 3.7/PyCharm Community Edition 2019.2 没有任何修改/插件。

推断的[bb_1, b_2, b_3, 1]类型是List[Union[Library, Book, int]],它通过以下方式匹配预期类型:

  1. 容器类型相同,List两种情况下
  2. 相同
  3. 实际值类型Union[Library, Book, int]包含预期的Book类型 - 此处类型检查器感到满意,什么也没说。

这是PyCharm类型系统中的一个错误。

相关内容

  • 没有找到相关文章

最新更新