方法变体装饰器
项目描述
varmeth
方法变体装饰器
一个简单的库,允许方法在运行时根据上下文动态选择实现方式,通过 装饰器 实现。
Varmeth 最初是 ManageIQ集成测试库 的一部分。
安装和使用
安装
varmeth
可以通过运行 pip install varmeth
安装
使用
以下示例展示了如何使用 varmeth
。您可以查看不同的 方法变体。您需要用 variable
装饰 默认方法 并将其与不同的 方法变体 注册。您还可以将 变体 注册为多个名称。
以下代码片段展示了如何在现实世界中使用 varmeth
。
在此示例中,tiger
方法将在运行时根据上下文改变其实现,因此必须用 @variable
注解来这样做。它将是 变量 方法。
此方法的主体将是 default
实现——在没有显式使用上下文时用于此方法的方法实现。
siberian_tiger
和 bengal_tiger
是 tiger
方法的两种不同实现,需要用 @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
实现这一点的一个示例:我们可以轻松地使用 UI
和 REST
作为参数来参数化 测试中的上下文。
import pytest
@pytest.mark.parametrize("context", ["ui", "rest"])
def test_delete_entity(context):
entity = Entity()
entity.delete(method=context)
贡献
如果您发现错误,请随意创建问题,或者继续提交您自己的拉取请求。
请注意:在提交新的 PR 时,请确保您的代码通过了所有检查。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。