类型工具¶
- deep_isinstance(obj, cls)[source]¶
isinstance()
的增强版本,可以处理基本的结构化typing
类型,包括 Funsor 项和其他GenericTypeMeta
实例,Union
,Tuple
,和FrozenSet
。不支持
TypeVar
、任意的Generic
、前向引用或可变的泛型集合类型(如List
)。当在obj
或cls
中遇到不支持的类型时,将尝试回退到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 项、Tuple
和FrozenSet
。不支持更高级的
typing
特性,例如TypeVar
、任意的Generic
子类型、前向引用或可变的集合类型(如List
)。当在subcls
或cls
中遇到不理解的类型时,将尝试回退到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()
的增强版本,可为有限的不可变数据结构(特别是tuple
和frozenset
)重构结构化的typing
类型。主要用于 Funsor 解释模式匹配的内部使用。示例
assert deep_type((1, ("a",))) is typing.Tuple[int, typing.Tuple[str]] assert deep_type(frozenset(["a"])) is typing.FrozenSet[str]
- 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__
。