方法变体装饰器
项目描述
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参数用于选择正确的上下文,使用正确的变体名称作为值。
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 实现
以下示例显示了一个实体类,它支持两个不同上下文
(前端)和(后端)上下文的删除操作。正如您可以推断的那样,每个上下文都需要非常不同的实现来删除实体。UIREST
使用 vanilla 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。提供。下面是一个如何使用 Pytest 做到这一点的示例Varmeth:我们可以使用和作为参数轻松地对被测上下文进行参数化。UIREST
import pytest
@pytest.mark.parametrize("context", ["ui", "rest"])
def test_delete_entity(context):
entity = Entity()
entity.delete(method=context)
贡献
如果您发现错误,请随意创建问题,或者继续提交您自己的拉取请求。
请注意:提交新 PR 时,请确保您的代码通过所有检查。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。