首页 > 解决方案 > 基于概率的装饰器

问题描述

我正在尝试使用以下语法编写一个接受参数的装饰器:

@random(0.5)
def func1():

所以概率表示函数被执行的可能性有多大。

例如:

@randomly(0.6)
def fa():
  return "abc"
 
@randomly(0.4)
def da():
  return "def"

运行时:

for i in range(5):
  print(da())

它将根据概率打印句子(3次'abc'和两次'def'):

abc
def
abc
abc
def

任何想法它应该如何工作?我还没有找到类似的东西。

标签: pythondecorator

解决方案


以下内容适用于您描述的 API:

from functools import wraps
from random import choices

functions, weights = [], []

def randomly(probability):
    def decorator(fn):
        @wraps(fn)
        def wrapper(*args, **kwargs):
            fn ,= choices(functions, weights=weights)
            return fn(*args, **kwargs)
        functions.append(fn)
        weights.append(probability)
        return wrapper
    return decorator

在此实现中,您必须确保自己的概率加起来为 1,否则它们将被自动缩放。


推荐阅读