2016-07-17 21 views
8

List là một lớp con của Sequence:Tại sao Danh sách [str] không phải là một lớp con của Chuỗi [str]

>>> from typing import List, Sequence 
>>> issubclass(List, Sequence) 
True 

nhưng List[str] không phải là một lớp con của Sequence[str]:

>>> issubclass(List[str], Sequence[str]) 
False 

Tại sao?

+1

Tại sao phải như vậy? 'List [str]' và 'Sequence [str]' giống như các trường hợp; các dạng cụ thể của loại chung. 'list()' cũng không phải là một lớp con của 'abc.Sequence()'. –

+0

Hoặc đặt nó khác: * Sử dụng * sẽ là mối quan hệ IS-A giữa 'Danh sách [str]' và 'Chuỗi [str]' có khi chú thích? –

Trả lời

1

Mối quan hệ IS-A nào giữa List[str]Sequence[str] có sử dụng khi chú thích không?

Đây là điểm chính để lấy đi. Kiểm tra xem loại có phải là loại phụ của loại khác không phải là một cái gì đó bạn nên làm trong khi nhập chú thích mã của bạn. Đây thường là một cái gì đó đã được nhận thấy và là lý do tại sao có một cuộc tranh luận trên the nuking of __subclasscheck__.

Như Mark Shannon states in a comment:

Nó có ý nghĩa để kiểm tra xem một loại là một subtype của một loại, nhưng đó là công việc của một kiểm tra tĩnh và không thuộc trong module gõ.

Dù bằng cách nào, kiểm tra là all made in GenericMetas __subclasscheck__, các metaclass với nhiều loại generic

Như là, việc thực hiện hiện nay là tập trung hơn vào những trường hợp loại container là tương tự nhưng các loại phụ kịch bản của họ khác nhau, trong này trường hợp, kiểm tra được thực hiện tùy thuộc vào các loại kịch bản phụ là covariant or contravariant. Ví dụ, List loại là không phải, như vậy, kiểm tra đối với một mối quan hệ subtype với:

issubclass(List[bool], List[int]) # checks if bool == int 

lợi nhuận sai. Đối với trình tự, các loại là hiệp biến, như vậy, sản lượng sau True:

issubclass(Sequence[bool], Sequence[int]) # checks if bool is a subclass of int 

Mặt khác, với nhiều loại mà không một loại nhất định (như trong trường hợp đầu tiên của bạn):

issubclass(List, Sequence) 

__subclasscheck__ trong GenericMeta sẽ delegate đến __subclasscheck__ in ABCMeta nơi sẽ đánh giá thành True.

Cuối cùng, nếu hai loại khác nhau, như trong:

issubclass(List[str], Sequence[str]) 

và các lớp cơ sở trong issubclass call is an instance of GenericMeta, False được trả về; điều kiện này được thỏa mãn cho hầu hết các loại trong số typing.

Bất kể trường hợp nào đáng nói đến là điều này có thể không tồn tại trong bản phát hành trong tương lai hoặc hành vi của nó có thể hoàn toàn khác; mô-đun vẫn là tạm thời.

Các vấn đề liên quan