Python 基于概率的装饰器

Python 基于概率的装饰器,python,decorator,Python,Decorator,我正在尝试编写一个decorator,它接受具有以下语法的参数: @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”和2次“def”):

我正在尝试编写一个decorator,它接受具有以下语法的参数:

@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”和2次“def”):


你知道该怎么做吗?我还没有找到类似的东西。

类似的东西可以:

from random import random


def randomly(prob):
    def decorator(function):
        def wrapper(*args, **kwargs):
            if prob > random():
                return function(*args, **kwargs)
        return wrapper
    return decorator
[你好,你好,没有,你好,你好,你好,你好,你好, 没有,'你好']


您可以查看有关此主题的更多信息。

以下内容将与您描述的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,否则它们将自动缩放。

为什么在客户端代码中使用
da()
,而不是
fa()
?或者这是武断的/它们应该是一样的吗?看看这个答案-。
@randomly(0.8)
def func():
    return "hello"

print([func() for _ in range(10)])
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