新typing模块包含几个名称如“SupportsInt”(-Float、-Bytes 等)的对象。模块的文档页面上的名称和描述可能会被解读为建议您可以测试对象是否属于“支持__int__()”类型。但是,如果您尝试使用isinstance(),它会给出一个响应,表明这不是您应该做的事情:
>>> isinstance(5, typing.SupportsInt)
(Traceback omitted)
TypeError: Protocols cannot be used with isinstance().
另一方面,您可以使用issubclass():
>>> issubclass((5).__class__, typing.SupportsInt)
True
>>> issubclass(type(5), typing.SupportsInt)
True
在这种情况下,什么是“协议”?为什么它不允许isinstance()以这种方式使用?