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