PyCharm 检查没有在类型注释中显示我自己的 class 的警告
PyCharm inspection doesn't show warnings for my own class in type annotaitions
这是我的代码。有用。注意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 中,我将 Book
、Library
和 int
添加到 books
中。 PyCharm 没有告诉我这是不是问题。
但是,如果我稍微修改 A 行 books: List[str] = field(default_factory=list)
(Book
<-> str
) 然后 PyCharm 会给出以下非常有用的警告:
Expected type 'Iterable[str]' (matched generic type 'Iterable[_T]'),
got 'List[Union[Library, Book, int]]' instead
那么,为什么 PyCharm 检查在这两种情况下表现不同?怎么才能看到原代码的警告?
P.S。 Win10 / Python 3.7 / PyCharm Community Edition 2019.2 没有任何 modifications/addons.
[bb_1, b_2, b_3, 1]
的推断类型为 List[Union[Library, Book, int]]
,它通过以下方式匹配预期类型:
- 容器类型相同,
List
两种情况
- 实际值类型
Union[Library, Book, int]
包含预期的 Book
类型 -- 这里的类型检查器很满意,什么也没说。
这是 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 中,我将 Book
、Library
和 int
添加到 books
中。 PyCharm 没有告诉我这是不是问题。
但是,如果我稍微修改 A 行 books: List[str] = field(default_factory=list)
(Book
<-> str
) 然后 PyCharm 会给出以下非常有用的警告:
Expected type 'Iterable[str]' (matched generic type 'Iterable[_T]'), got 'List[Union[Library, Book, int]]' instead
那么,为什么 PyCharm 检查在这两种情况下表现不同?怎么才能看到原代码的警告?
P.S。 Win10 / Python 3.7 / PyCharm Community Edition 2019.2 没有任何 modifications/addons.
[bb_1, b_2, b_3, 1]
的推断类型为 List[Union[Library, Book, int]]
,它通过以下方式匹配预期类型:
- 容器类型相同,
List
两种情况 - 实际值类型
Union[Library, Book, int]
包含预期的Book
类型 -- 这里的类型检查器很满意,什么也没说。
这是 PyCharm 类型系统中的错误。