跳转到主要内容

OOP Extensions是一组Python标准库中找不到的面向对象编程实用工具。

项目描述

https://img.shields.io/pypi/v/oop-ext.svg https://img.shields.io/pypi/pyversions/oop-ext.svg https://github.com/ESSS/oop-ext/workflows/build/badge.svg https://codecov.io/gh/ESSS/oop-ext/branch/master/graph/badge.svg https://img.shields.io/readthedocs/oop-extensions.svg https://results.pre-commit.ci/badge/github/ESSS/oop-ext/master.svg

什么是OOP扩展?

OOP扩展是一组用于面向对象编程的实用工具,这些工具在Python核心库中缺失。

用法

oop_ext提供了一组面向对象的实用工具,它支持接口、抽象/可重写方法等概念。oop_ext仔细检查实现是否具有与它实现的接口相同的函数签名,否则会引发异常。

以下是一个展示一些优秀功能的简单示例

from oop_ext.interface import Interface, ImplementsInterface


class IDisposable(Interface):
    def dispose(self):
        """
        Clears this object
        """

    def is_disposed(self) -> bool:
        """
        Returns True if the object has been cleared
        """


@ImplementsInterface(IDisposable)
class MyObject(Disposable):
    def __init__(self):
        super().__init__()
        self._data = [0] * 100
        self._is_disposed = False

    def is_disposed(self) -> bool:
        return self._is_disposed

    def dispose(self):
        self._is_disposed = True
        self._data = []

如果MyObject中的任何两个方法未实现或与IDisposable中声明的签名不同,则ImplementsInterface装饰器在导入期间将引发错误。

可以使用IsImplementation验证任意对象是否实现特定接口

from oop_ext.interface import IsImplementation

my_object = MyObject()
if IsImplementation(my_object, IDisposable):
    # my_object is guaranteed to implement IDisposable completely
    my_object.dispose()

或者您可以使用AssertImplements断言对象实现了所需的接口

from oop_ext.interface import AssertImplements

my_object = MyObject()
AssertImplements(my_object, IDisposable)
my_object.dispose()

类型检查

1.1.0版本开始,oop-ext包括内联类型注解,并将它们暴露给用户程序。

如果您在测试中运行类型检查器(如mypy),您可能会开始注意到指示不正确使用的类型错误。如果您遇到您认为是错误的错误,请在问题中告诉我们。

这些类型是在mypy版本0.800下开发的。

有关更多信息,请参阅文档

贡献

有关设置开发环境和如何为oop_ext做出贡献的指导,请参阅贡献指南

发布

关于如何进行新发布的维护者提醒。

请注意,VERSION应遵循语义版本控制,格式为X.Y.Z,例如:v1.0.5

  1. upstream/master创建一个release-VERSION分支。

  2. 更新CHANGELOG.rst

  3. 推送带有更改的分支。

  4. 一旦所有构建都通过,请将VERSION标签推送到upstream

  5. 合并PR。

2.1.0 (2021-03-19)

  • #48:添加了新的类型检查器友好的proxy = GetProxy(I, obj)函数,作为proxy = I(obj)的替代方案。后者通常不被类型检查器接受,因为接口是协议,不能被实例化。

    还修复了AsssertImplements的类型检查错误

    Only concrete class can be given where "Type[Interface]" is expected

    这是由于python/mypy#5374

2.0.0 (2021-03-10)

  • #47:接口不再检查类型注解。

    最初支持此功能,但在实践中,此功能已显示出阻碍逐步采用类型注解的倾向,因为它会阻止添加类型注解来改进现有接口,或在不更新接口(以及所有其他实现)的情况下对现有实现进行注解。

    因此,决定让静态类型检查器正确处理匹配的类型注解,因为它可以比oop-ext之前做得更准确。

1.2.0 (2021-03-09)

  • #43:修复了对类型注解的AttributeReadOnlyAttribute的支持

    class IFoo(Interface):
        value: int = Attribute(int)

1.1.2 (2021-02-23)

  • 问题#41:修复了在1.1.0版本中引入的回归,该回归导致使用callback.Aftercallback.Before安装回调会使方法不再符合其接口所需的签名。

1.1.1 (2021-02-23)

  • 问题#38:重新引入extra_args参数到Callback._GetKey,以便子类可以利用它。

  • 问题#36:修复了在1.1.0版本中引入的回归,该回归导致在接口实现中无法使用AbstractImplements装饰器。

1.1.0 (2021-02-19)

  • 问题#25:oop-ext现在包含内联类型注解,并将它们暴露给用户程序。

    如果您在测试中运行类型检查器(如mypy),您可能会开始注意到指示不正确使用的类型错误。如果您遇到您认为是错误的错误,请在问题中告诉我们。

    这些类型是在mypy版本0.800下开发的。

  • 问题#26:引入了新的类型检查Callback变体,如Callback0Callback1Callback2等,在几乎零运行时成本的情况下提供对所有操作(调用、Register等)的类型检查。

    示例

    from oop_ext.foundation.callback import Callback2
    
    
    def changed(x: int, v: float) -> None:
        ...
    
    
    on_changed = Callback2[int, float]()
    on_changed(10, 5.25)
  • 修复了Callbacks.BeforeCallbacks.After签名:之前它们的签名表明它们支持多个回调,但这是一种错误,因为它会破坏调用者,因为第2个参数之后的每个参数都会被认为是sender_as_parameter参数,该参数被转发到_shortcuts.py模块的AfterBefore函数。

1.0.0 (2020-10-01)

  • Callbacks可以用作上下文管理器,它提供了Register(callback, function),当上下文管理器结束时,它会自动注销所有函数。

  • Callback.Register(function)现在返回一个具有Unregister()方法的对象,可用于取消注册调用。

0.6.0 (2020-01-31)

  • requires_declaration的默认值改回True,并修复了一个错误(#22),其中缓存没有正确清除。

0.5.1 (2019-12-20)

  • 修复了一个问题(#20),其中模拟的classmethods在内部检查期间被认为不是有效的方法。

0.5.0 (2019-12-12)

  • 添加可选参数requires_declaration,以便用户可以决定是否需要@ImplementsInterface声明。

0.4.0 (2019-12-03)

  • 实现不再需要显式声明它们使用@ImplementsInterface声明接口:检查是由AssertImplements和等效函数隐式(并缓存)完成的。

0.3.2 (2019-08-22)

  • 接口和实现方法不再可以包含可变默认值,因为这通常被认为是一种不良实践。

  • Null实例现在是可哈希的。

0.3.1 (2019-08-16)

  • 修复了创建实例“接口存根”时的签名不匹配问题。

    foo = IFoo(Foo())

0.3.0 (2019-08-08)

  • 接口现在支持关键字参数。

0.2.4 (2019-03-22)

  • 移除未使用的异常FunctionNotRegisteredError,该异常已停用多年。

0.2.3 (2019-03-22)

  • 修复了嵌套回调中忽略异常的问题。

0.2.1 (2019-03-14)

  • 修复问题并删除过时代码。

0.1.8 (2019-03-12)

  • PyPI上的首个版本。

项目详情


下载文件

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

源分发

oop-ext-2.1.0.tar.gz (74.9 kB 查看哈希值)

上传时间 源代码

构建的发行版

oop_ext-2.1.0-py3-none-any.whl (73.1 kB 查看哈希值)

上传时间 Python 3

支持