跳转到主要内容

方法变体装饰器

项目描述

varmeth

方法变体装饰器

Python Versions PyPI version github actions License: GPLv3 Code style: black

一个简单的库,允许方法在运行时根据上下文动态选择实现方式,通过 装饰器 实现。

Varmeth 最初是 ManageIQ集成测试库 的一部分。

安装和使用

安装

varmeth 可以通过运行 pip install varmeth 安装

使用

以下示例展示了如何使用 varmeth。您可以查看不同的 方法变体。您需要用 variable 装饰 默认方法 并将其与不同的 方法变体 注册。您还可以将 变体 注册为多个名称。

以下代码片段展示了如何在现实世界中使用 varmeth

在此示例中,tiger 方法将在运行时根据上下文改变其实现,因此必须用 @variable 注解来这样做。它将是 变量 方法。

此方法的主体将是 default 实现——在没有显式使用上下文时用于此方法的方法实现。

siberian_tigerbengal_tigertiger 方法的两种不同实现,需要用 @tiger.variant("variant-name") 注解,其中 variant-name 是一个字符串标识符,将在运行时用于选择所需的 variant 实现这些将是 变体

请注意,变量 方法可以与多个实现或 变体 关联。

from varmeth import variable

class CatFamily(object):
   @variable
   def tiger(self):
       print("Default Method!")
       print("Tiger")

   @tiger.variant("siberian")
   def siberian_tiger(self):
       print("Siberian Tiger")

   @tiger.variant("indian", "bengal")
   def bengal_tiger(self):
       print("Bengal Tiger")

要选择不同的 变体,使用 method 参数选择适当的上下文,使用适当的 variant-name 作为值。

In [1]: cat = CatFamily()

In [2]: cat.tiger()
Default Method!
Tiger

In [3]: cat.tiger(method="siberian")
Siberian Tiger

In [4]: cat.tiger(method="indian")
Bengal Tiger

In [5]: cat.tiger(method="bengal")
Bengal Tiger

您还可以使用 alias 参数给 默认 方法添加别名,尽管请注意,只允许一个 default 方法。

from varmeth import variable

class Reptiles(object):
   @variable(alias="python")
   def snake(self):
       print("Python Snake")

   @snake.variant("kobra")
   def kobra_snake(self):
       print("Kobra Snake")
In [1]: rep = Reptiles()

In [2]: rep.snake()
Python Snake

In [3]: rep.snake(method="python")
Python Snake

In [4]: rep.snake(method="kobra")
Kobra Snake

使用 Varmeth 与纯 Python 实现对比

以下示例展示了一个支持两种不同上下文的 实体 类,即 UI(前端)和 REST(后端)上下文。如您所推断的,每个上下文都需要非常不同的实现来删除实体。

使用纯 Python 实现时,您必须针对每个上下文 显式地 调用适当的方法。相反,您可以简单地调用相同的方法并提供上下文,然后 Varmeth 会完成其余的工作。

纯 Python Varmeth
class Entity(object):
    def delete_ui(self):
        print("Delete with UI!")

    def delete_rest(self):
        print("Delete with REST!")

entity = Entity()
entity.delete_ui()      # >> Delete with UI!
entity.delete_rest()    # >> Delete with REST!
from varmeth import variable

class Entity(object):
    @variable(alias="ui")
    def delete(self):
        print("Delete with UI!")

    @delete.variant("rest")
    def delete_rest(self):
        print("Delete with REST!")

entity = Entity()
entity.delete()                 # >> Delete with UI!
entity.delete(method="ui")      # >> Delete with UI!
entity.delete(method="rest")    # >> Delete with REST!

如您所见,Varmeth 提供了一个非常方便的 上下文切换器 接口,这在实现集成测试时可能非常有用,这些测试旨在遵循测试参数化模式,例如一些流行的测试框架,如 Pytest。以下是如何使用 Varmeth 实现这一点的一个示例:我们可以轻松地使用 UIREST 作为参数来参数化 测试中的上下文

import pytest

@pytest.mark.parametrize("context", ["ui", "rest"])
def test_delete_entity(context):
   entity = Entity()
   entity.delete(method=context)

贡献

如果您发现错误,请随意创建问题,或者继续提交您自己的拉取请求。

请注意:在提交新的 PR 时,请确保您的代码通过了所有检查。

项目详情


下载文件

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

源分布

此发布版本没有可用的源分布文件。请参阅有关 生成分布存档 的教程。

构建分布

varmeth-1.0.1-py3-none-any.whl (29.2 kB 查看哈希值)

上传于 Python 3

支持者

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页面