类型工具

class GenericTypeMeta(name, bases, dct)[source]

基类: type

支持带有参数的子类型用于模式匹配的元类,例如 Number[int, int]

class Variadic[source]

基类: object

一个类型兼容的 Variadic 的直接替代品。

deep_isinstance(obj, cls)[source]

isinstance() 的增强版本,可以处理基本的结构化 typing 类型,包括 Funsor 项和其他 GenericTypeMeta 实例,UnionTuple,和 FrozenSet

不支持 TypeVar、任意的 Generic、前向引用或可变的泛型集合类型(如 List)。当在 objcls 中遇到不支持的类型时,将尝试回退到 isinstance()

用法

x = (1, ("a", "b"))
assert deep_isinstance(x, typing.Tuple[int, tuple])
assert deep_isinstance(x, typing.Tuple[typing.Any, typing.Tuple[str, ...]])
参数
  • obj – 一个可能是 cls 实例的对象。

  • cls – 一个可能是 obj 的父类的类。

deep_issubclass(subcls, cls)[source]

issubclass() 的增强版本,可以处理结构化类型,包括 Funsor 项、TupleFrozenSet

不支持更高级的 typing 特性,例如 TypeVar、任意的 Generic 子类型、前向引用或可变的集合类型(如 List)。当在 subclscls 中遇到不理解的类型时,将尝试回退到 issubclass()

用法

class A: pass
class B(A): pass

assert deep_issubclass(typing.Tuple[int, B], typing.Tuple[int, A])
assert not deep_issubclass(typing.Tuple[int, A], typing.Tuple[int, B])

assert deep_issubclass(typing.Tuple[A, A], typing.Tuple[A, ...])
assert not deep_issubclass(typing.Tuple[B], typing.Tuple[A, ...])
参数
  • subcls – 一个可能是 cls 的子类的类。

  • cls – 一个可能是 subcls 的父类的类。

deep_type(obj)[source]
deep_type(obj: tuple)
deep_type(obj: frozenset)

type() 的增强版本,可为有限的不可变数据结构(特别是 tuplefrozenset)重构结构化的 typing 类型。主要用于 Funsor 解释模式匹配的内部使用。

示例

assert deep_type((1, ("a",))) is typing.Tuple[int, typing.Tuple[str]]
assert deep_type(frozenset(["a"])) is typing.FrozenSet[str]
get_args(tp)[source]
get_origin(tp)[source]
get_type_hints(obj, globalns=None, localns=None)[source]

返回一个对象的类型提示。

这通常与 obj.__annotations__ 相同,但它可以处理编码为字符串字面量的向前引用,并且在必要时,如果设置了等于 None 的默认值,则会添加 Optional[t]。

参数可以是模块、类、方法或函数。注解以字典形式返回。对于类,注解还包括继承的成员。

如果参数类型不能包含注解,则会引发 TypeError;如果不存在注解,则返回一个空字典。

注意 – globalns 和 localns 的行为是反直觉的(除非你熟悉 eval() 和 exec() 的工作原理)。查找顺序是先局部,后全局。

  • 如果没有传递字典参数,将尝试使用来自 obj 的全局变量(或类对应的模块的全局变量),这些全局变量也用作局部变量。如果对象似乎没有全局变量,则使用一个空字典。

  • 如果传递一个字典参数,它将同时用作全局变量和局部变量。

  • 如果传递两个字典参数,它们分别指定全局变量和局部变量。

register_subclasscheck(cls)[source]

用于注册一个自定义 __subclasscheck__ 方法的装饰器,该方法仅在 deep_issubclass() 中调用。

这主要用于在运行时与 typing 库一起使用。如果可能,优先使用元类以常规方式覆盖 __subclasscheck__

class typing_wrap(tp)[source]

基类: object

用于覆盖 typing 对象运行时行为的实用可调用对象。