2016-06-29 2 views
3

Как узнать, является ли данный класс подклассом любого typing.Generic? Вызов issubclass, кажется, не работает, как ожидалось:Is issubclass сломан для сравнения с typing.Generic в Python 3.5?

import typing 

T = typing.TypeVar('T') 

class A(typing.Generic[T]): 
    pass 

class B: 
    pass 

issubclass(A, typing.Generic) 
>>> True 

issubclass(B, typing.Generic) 
>>> Traceback (most recent call last): 
... <more traceback lines here> 
File "<some_path>\env\lib\abc.py", line 225, in __subclasscheck__ 
    for scls in cls.__subclasses__(): 
TypeError: descriptor '__subclasses__' of 'type' object needs an argument 

Кроме того, я упускаю что-нибудь, и это ожидаемое поведение или это ошибка?

Итак, можно ли предположить, что если TypeError поднят, то это НЕ подкласс typing.Generic?

Я использую Python 3.5.2.

спасибо.

+0

Может быть, это должно быть 'issubclass (B, typing.Generic [T]) ' –

+0

Он работает, да, но только в этом случае, поскольку общий может иметь более одного параметра параметра. –

ответ

2

Это ожидаемое поведение (по крайней мере, сейчас). Вы не можете смешивать тип, указанный в контексте типа, намекающего на класс. Вы можете считать type ярлыком для проверки типа. Класс - это объект времени выполнения, с которым вы взаимодействуете.

Дополнительную информацию можно найти в следующем thread on the issue tracker для печатающего модуля (в частности, см. Сообщение this).

Просто для записи, typing еще временных, много ошибок и много изменений могут произойти до тех пор, пока не считаются стабильными, они по-прежнему тонкими настройкой и никаких гарантий не на месте. В качестве примера, в Python 3.5.1 ваш код работает плавно без каких-либо TypeError с (они были введены в 3.5.2 от того, что я понимаю):

issubclass(A, typing.Generic) 
Out[28]: True 

issubclass(B, typing.Generic) 
Out[31]: False 
Смежные вопросы