跳转到主要内容

将类型检查的规范表示为Python类,并增量构建它们。

项目描述

Spec Classes Logo

PyPI - Version Conda Forge - Version PyPI - Python Version PyPI - Status build codecov Code Style

简介

spec_classes 是标准库中 dataclass 装饰器的通用化(但大部分是互操作的)。它添加了类型检查、丰富的字段准备和方便的写时复制突变包装器等功能。Spec-class定义是Pythonic的,简单且简洁。

这个库在需要运行时验证和即时反馈的环境中特别有用,并且/或者当正确性比性能更重要时。尽管如此,我们确实尝试保持spec-classes的性能(请参阅性能细节)。

哲学

用户做错事情应该是困难的。 spec_classes 被设计用来帮助最终用户安全地与、修改和组装(特别是在笔记本等临时环境中)大量数据类库,而不用担心破坏它们。数据类的操作应该是原子的(操作永远不会部分提交),经过验证的(类型应该匹配等),并在用户犯错误时提供即时有用的反馈。

我们不拥有你的类。 spec_classes 永远不会 覆盖本地已存在的方法,也不会添加任何元类或父类。如果你用 @spec_class 装饰一个类,spec 类会添加(如果你尚未添加)一些内置的魔法方法(如 __init____setattr__ 等),以及一些辅助方法... 仅此而已。spec 类最终只是预先加载了一些有用方法的标准类,你不必亲自编写这些方法。

默认采用写时复制。 使用类实例作为规范的一个危险是,如果在某个上下文中发生了修改,它们会在所有上下文中被修改。spec 类(默认情况下)不会阻止(类实例的)局部修改(你仍然可以执行 my_spec.foo = 'bar');但所有辅助方法默认返回一个修改后的副本。例如,my_spec.with_foo('bar') 将不会是 my_spec 的同一个实例,因此这些方法总是安全使用的。

保持一致性。spec_classes 添加的所有辅助方法都存在于定义良好的命名空间内;即:with_<attr>transform_<attr> 等;每种方法类都具有相同的命名约定,并提供完整的内联文档。这使得用户很容易了解如何使用这些方法,以及如何覆盖这些方法或添加不冲突的新方法。

最小化意外。 spec 类的行为几乎总是与功能重叠的基本 Python 类的行为相匹配,并且在其他情况下(例如,当违反类型检查时)应该是直观的。

性能很重要。 虽然 spec_classes 的主要目标不是性能,但考虑到目标功能集,引入的额外开销应尽可能小。

示例

from spec_classes import spec_class

@spec_class
class Rectangle:
    width: float
    height: float
    color: str

    @property
    def area(self):
        return self.width * self.height

rect = Rectangle()
rect  # Rectangle(width=MISSING, height=MISSING, color=MISSING)
rect.update(width=10., height=12.).with_color("red")  # Rectangle(width=10.0, height=12.0, color='red')

Rectangle(width=10., height=10.).area  # 100.0

rect.with_width('invalid')  # TypeError: Attempt to set `Rectangle.width` with an invalid type [got `'invalid'`; expecting `float`].

有关使用方法的更多详细信息,请参阅文档

安装

spec 类可以通过 pipconda 安装。

要使用 pip 安装,可以使用

pip install spec-classes

要使用 conda 安装,可以使用

conda install spec-classes

你可以通过打印已安装的 spec-classes 的版本来验证安装是否成功

python -c "import spec_classes; print(spec_classes.__version__)"

相关项目和先例

spec_classes 在数据类的构建和修改方面比这个空间中的大多数库持有更坚定的立场。尽管如此,对于那些寻求更轻量级替代方案的人来说,仍有一些出色的现有 spec-classes 替代品。特别是,你可以考虑以下选项

  • typeguard:一个用于运行时类型检查函数、方法和类的实用程序库。
  • pytypes:另一个用于运行时类型检查函数、方法和类的实用程序库。
  • pydantic:一个轻量级的数据解析和验证库,也使用类型提示。
  • attrs:一个库,它提供了 Python 数据类的全部功能,但仍然没有运行时开销(没有类型检查,额外的辅助方法等)。

还有许多其他库致力于映射和验证从 JSON 到 Python 类的转换,但这些与本项目目标(即使 Python 类本身变得易于使用)有些不同,因此在此未包含。

项目细节


下载文件

下载适用于您平台的文件。如果您不确定该选择哪一个,请了解更多关于安装包的信息。

源代码分发

spec_classes-1.5.2.tar.gz (316.1 kB 查看哈希值)

上传时间 源代码

构建分发

spec_classes-1.5.2-py3-none-any.whl (65.1 kB 查看哈希值)

上传时间 Python 3

由以下机构支持