2017-02-03 11 views
5

Trước khi tôi nâng cấp lên python 3.6 từ python 3.5 này làm việc:khác biệt mypy trong isinstance và issubclass từ python 3,5-3,6 trong Generics tham số

import typing 
issubclass(list, typing.List[int]) # returns True 
isinstance([1, 2 ,3], typing.List[int]) # returns True 

bây giờ trong python 3.6 cả hai nâng cao ngoại lệ sau đây:

TypeError: Parameterized generics cannot be used with class or instance checks 

Hành vi dự định mới này hoặc lỗi? Nếu nó được dự định như thế nào tôi có thể thực hiện các kiểm tra mã ở trên đang làm trong python 3.6?

+0

Tôi không nghĩ rằng họ đã từng kiểm tra các loại phần tử, do đó, '[" a "," b "," c "]' sẽ thông qua 'isinstance ([" a "," b "," c " ], typing.List [int]) '. Ngữ nghĩa thực hiện của kiểm tra không hữu ích. – user2357112

Trả lời

3

Đó là cố ý, bạn không nên pha trộn các loại với các loại như được định nghĩa trong typing, ít nhất, đó là ý chính của nó từ những gì tôi đã hiểu. Rất nhiều cuộc thảo luận về vấn đề này có trong số #136 Kill __subclasscheck__ cũng giới thiệu sự thay đổi này. Các commit message cũng tham khảo cách kiểm tra isinstance/subclass sẽ tăng TypeError s:

Sử dụng isinstance() hoặc issubclass() tăng TypeError cho hầu hết mọi thứ. Có những ngoại lệ: [...]

Bạn thể so sánh mà không chỉ định các loại chứa cho các loại chung chung, tức là:

isinstance(list, typing.List[int]) 

nhưng đó là tốt nhất bạn có thể làm afaik.

+1

Cảm ơn, liên kết thông tin. Vì vậy, không có cách nào để loại xác nhận bằng cách sử dụng các loại từ đánh máy? Ví dụ: nếu tôi muốn đảm bảo các đầu vào cho một hàm phù hợp với chú thích kiểu của hàm trước khi khởi chạy một quy trình xử lý kéo dài? Tôi biết điều này có thể được thực hiện tĩnh với mypy nhưng tôi chạy vào một trường hợp được nó chỉ có thể được thực hiện tự động trong mã python chính nó. Có một số nói về điều này trong PR nhưng tôi không thấy rằng nó thực sự đã đi bất cứ nơi nào. – derchambers

+1

bằng cách này, 'isinstance (danh sách, gõ.List [int])' vẫn làm tăng TypeError – derchambers

+0

chỉnh sửa câu trả lời của bạn để mã phù hợp với những gì bạn mô tả trong văn bản. – derchambers

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