2016-06-29 19 views
3

Wie finde ich heraus, ob eine gegebene Klasse eine Unterklasse von typing.Generic ist? issubclass Aufruf scheint nicht, wie ich erwartet:Ist issubclass für den Vergleich mit typing.Generic in Python 3.5 gebrochen?

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 

Auch bin ich etwas fehlt, und dies ist ein erwartetes Verhalten oder ist das ein Fehler?

Also, ist es sicher anzunehmen, dass, wenn TypeError ausgelöst wird, dann ist es keine Unterklasse von typing.Generic?

Ich benutze Python 3.5.2.

Vielen Dank.

+0

Vielleicht sollte es sein 'issubclass (B, typing.Generic [T]) ' –

+0

Es funktioniert, ja, aber nur in diesem Fall, wie ein generischer kann mehr als einen Typparameter zur Verfügung gestellt haben. –

Antwort

2

Dies ist das erwartete Verhalten (zumindest jetzt). Sie können einen Typ nicht wie im Kontext des Typs Hinting mit einer Klasse angegeben mischen. Sie können eine type als ein Tag, eine Angabe für einen möglichen Typ Checker betrachten. Eine Klasse ist ein Laufzeitobjekt, mit dem Sie interagieren.

Weitere Informationen finden Sie in der folgenden thread on the issue tracker für das Typisierungsmodul (genauer gesagt in this post).

Nur für das Protokoll, typing ist noch vorläufige, könnten viele Fehler und viele Veränderungen auftreten, bis es stabil angesehen wird, werden sie es immer noch keine Garantien und sind an Ort und Stelle zwicken. Als Beispiel läuft in Python 3.5.1 Code glatt w/o irgendwelchen TypeError s (sie in 3.5.2 von eingeführt wurden, was ich sammeln):

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

issubclass(B, typing.Generic) 
Out[31]: False