Skip to main content

方法变体装饰器

项目描述

varmeth

方法变体装饰器

Python 版本 PyPI 版本 github 动作 许可证:GPLv3 代码风格:黑色

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

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 时,请确保您的代码通过所有检查。

项目详情


下载文件

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

源分布

varmeth-0.0.2.tar.gz (21.2 kB 查看哈希

已上传 source

内置分布

varmeth-0.0.2-py3-none-any.whl (16.8 kB 查看哈希

已上传 py3