12

我试图了解 Python 的类型注释是如何工作的(例如Listand Dict- not listordict)。具体来说,我对如何isinstance(list(), List)工作很感兴趣,这样我就可以创建自己的自定义注释。

我看到它List被定义为:

class List(list, MutableSequence[T], extra=list):
    . . .

我很熟悉,metaclass = xxx但我找不到任何关于此的文档extra = xxx。这是一个关键字还是只是一个参数,如果是,它来自哪里,它是否符合我的要求?它甚至与 相关isinstance吗?

4

1 回答 1

12

isinstance()andissubclass()钩子,泛型object.__instancecheck__()object.__subclasscheck__()使用。typing

如果你想提供自己的泛型,你真的很想研究typing模块源代码,特别是如何GenericMetaGeneric用于定义其他泛型类型,如List;大多数此类检查都委托给abc.ABCMeta.__subclasshook__. 你可以用这样的钩子定义你自己的 ABC,然后定义一个继承它的 Generic。

正是GenericMeta这里的元类也赋予了extra关键字参数含义。这样的内部结构仍然很少记录,因为typing实现仍在不断变化,模块仍然是临时的。extra参数存储为自定义实现__extra__并用于自定义__subclasshook__实现;因为extra=list它简单地归结为翻译isinstance(something, List)isinstance(something, list)

请注意,对运行时检查的支持是故意限制的;静态类型检查器实际上不会运行这些钩子。有关开发人员如何考虑如何为复杂的自定义类提供更好的支持的进一步讨论,请参见 mypy 跟踪器中的结构子类型讨论,这些自定义类可能实现也可能不实现足够的方法来被视为映射序列或类似的方法。

于 2017-05-23T11:11:11.173 回答