business-rules使用@rule_action
时间: 2023-12-06 17:44:53 浏览: 31
@rule_action 是 business-rules 中用于定义规则动作的装饰器。它可以用于将一个 Python 函数标记为规则动作,并在规则匹配成功时调用该函数。
下面是一个使用 @rule_action 装饰器的示例:
```python
from business_rules import rule
@rule
def is_discounted(order):
return order.total_price > 100 and order.customer.has_membership
@is_discounted.rule_action
def apply_discount(order):
order.total_price = order.total_price * 0.9
```
在上面的示例中,当订单的总价大于100并且客户拥有会员资格时,匹配规则 is_discounted 成功,并调用规则动作 apply_discount 函数来对订单进行折扣处理。
需要注意的是,使用 @rule_action 装饰器定义规则动作时,被装饰的函数需要接受规则条件中定义的参数,并且不能有返回值,因为规则动作的作用是修改传入的对象或执行一些副作用操作。
相关问题
business-rules使用的例子
下面是一个简单的使用 business-rules 库的例子:
假设你在一个电商平台中,需要根据订单金额来计算折扣。根据以下规则定义你的业务规则:
- 订单金额小于 100 元不打折;
- 订单金额在 100-200 元范围内打 5 折;
- 订单金额大于 200 元打 8 折。
首先,你需要安装 business-rules 库:
```
pip install business-rules
```
然后,你可以按照以下方式定义规则:
```python
from business_rules import rule, run_all
class DiscountRules:
@rule(name="No discount", description="Order amount < 100")
def no_discount(self, order):
return order.amount < 100
@rule(name="5% discount", description="Order amount between 100 and 200")
def five_percent_discount(self, order):
return 100 <= order.amount < 200
@rule(name="8% discount", description="Order amount > 200")
def eight_percent_discount(self, order):
return order.amount >= 200
```
在上面的代码中,我们定义了一个 `DiscountRules` 类,其中包含三个方法,每个方法都代表一个规则。每个规则都有一个名字和描述,并且接受一个订单对象作为参数。规则的返回值应该是一个布尔值,指示该规则是否适用于给定的订单。
然后,你可以使用 `run_all` 方法来评估所有规则,并获取适用的规则列表:
```python
from business_rules import run_all
class Order:
def __init__(self, amount):
self.amount = amount
order = Order(amount=150)
rules = DiscountRules()
run_all(rule_list=rules, defined_variables=[order])
for rule in rules.rule_list:
if rule.is_triggered:
print(f"Rule '{rule.name}' triggered")
```
在上面的代码中,我们创建了一个订单对象,并将其传递给 `run_all` 方法。我们还通过 `defined_variables` 参数将订单变量传递给 `run_all` 方法。最后,我们循环遍历所有规则,并检查哪些规则被触发。
如果你运行上面的代码,你应该会在控制台中看到输出:
```
Rule '5% discount' triggered
```
这表明订单满足第二个规则,因此该规则被触发。
当然,在实际情况下,你需要根据你的业务需求定义多个规则,并根据它们的优先级来处理它们的触发顺序。但是,上面的示例可以帮助你了解如何使用 business-rules 库来实现基本的业务规则。
用business-rules写conditions和actions
Business Rules 是一种用于定义业务规则的工具,它允许你在不编写代码的情况下定义条件和操作。
下面是一个示例,展示如何使用 Business Rules 来定义条件和操作:
```
from business_rules import rule
from business_rules.actions import BaseActions, rule_action
from business_rules.fields import FIELD_NUMERIC
from business_rules.variables import BaseVariables, numeric_rule_variable
class ShippingVariables(BaseVariables):
def __init__(self, order_total):
self.order_total = order_total
@numeric_rule_variable
def order_total(self):
return self.order_total
class ShippingActions(BaseActions):
@rule_action(params={'discount_amount': FIELD_NUMERIC})
def apply_discount(self, discount_amount):
self.discount_amount = discount_amount
@rule(name='Free shipping for expensive orders',
description='Free shipping for orders over $1000',
variables=ShippingVariables)
def free_shipping_for_expensive_orders(facts):
return facts.order_total > 1000
@rule(name='Apply discount for large orders',
description='Apply a 10% discount for orders over $500',
variables=ShippingVariables,
actions=ShippingActions)
def apply_discount_for_large_orders(facts):
if facts.order_total > 500:
ShippingActions.apply_discount(discount_amount=facts.order_total * 0.1)
return True
return False
```
在上面的示例中,我们定义了两个规则:一个用于决定订单是否可以享受免费运输,另一个用于在订单超过 $500 时应用 10% 的折扣。我们还定义了一个 ShippingVariables 类,它包含了我们需要在规则中使用的变量(在这种情况下,只有订单总额),以及一个 ShippingActions 类,它包含了我们可以在规则中使用的操作(在这种情况下,只有应用折扣)。
规则的定义非常类似于 Python 函数。每个规则都有一个名称、描述、变量和操作(可选)。每个规则还有一个返回 True 或 False 的函数,用于判断条件是否满足。如果规则包含操作,则可以在规则中使用它们来改变规则外部的状态。
在这个例子中,我们使用了一些 Business Rules 提供的辅助函数,如 numeric_rule_variable 和 rule_action,以方便地定义变量和操作。