将静态类型检查委托给属性

问题描述

在 Python 3.9 中,我试图将类型和实例检查与类型提示注释统一起来,以便在一个类中进行静态类型检查。因为 get_origin 和 get_type_hints 仍在不断变化,我不想为不同的类型语法构建解析器,所以我希望创建一个简单的类,在 Python 统一其静态和运行时类型之前,它可以同时满足这两个目的。而且我不希望任何受支持的检查(静态类型检查、isinstance 和 issubclass)依赖于继承。 Python 3.10 可能会通过结构模式匹配以不同的方式解决这个问题,但我正在寻找 3.9 下的解决方案。而且我想避免导入像 pydantic 这样开销较大的包。这是我的基本想法:

import abc
from collections.abc import MutableMapping
import dataclasses
from typing import Annotated,Any,Hashable,Type


@dataclasses.dataclass
class Kind(abc.ABC):

    comparison: ClassVar[Type]
    annotation: ClassVar[Annotated]
    
    @classmethod
    def __instancecheck__(cls,instance: Any) -> bool:
        return isinstance(instance,cls.comparison)
    
    @classmethod
    def __subclasscheck__(cls,subclass: Type) -> bool:
        return issubclass(subclass,cls.comparison)

我使用数据类是因为它们使类型声明易于阅读和压缩。如果这造成功能问题,我可以切换到普通类。 比较类属性保存用于运行时 isinstance 和 issubclass 检查的类。更复杂的 Kind 子类在 instancechecksubclasscheck 方法中可以有更大的规则和限制。我的解决方案的那部分工作正常。 注释类属性应保存静态类型检查器使用的类型提示注释中使用的值。因此,例如,这是 Kind 的 Dictionary 子类:

@dataclasses.dataclass
class Dictionary(Kind):

    comparison: ClassVar[Type] = MutableMapping
    annotation: ClassVar[Annotated] = MutableMapping[Hashable,Any] 

有什么方法可以使用像 Dictionary 这样的 Kind 子类作为类型提示而不特别包含注释类属性?我的特定项目具有更复杂的复合数据类型,例如邻接列表、邻接矩阵、树和其他自定义类型。

所以,我宁愿能够这样做:

def make_upper(dictionary: Dictionary) -> Dictionary:

比这个:

def make_upper(dictionary: Dictionary.annotation) -> Dictionary.annotation:

我不确定如何实施解决方案的后一部分。我尝试过使用 TypeVar、Generic 和 class_getitem,但我似乎无法让它们工作。基本上,我只希望 mypy 和其他静态类型检查器在测试期间查看注释属性。我只是不知道如何将静态类型检查委托给适当的属性。似乎我错过了一些明显的东西。任何建议表示赞赏。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)