python - 基于概率的装饰器
问题描述
我正在尝试使用以下语法编写一个接受参数的装饰器:
@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
任何想法它应该如何工作?我还没有找到类似的东西。
解决方案
以下内容适用于您描述的 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,否则它们将被自动缩放。
推荐阅读
- apache-spark - 前向填充多列可重用功能代码
- c++ - 在 C++ 中使用 AssocQueryString 获取可执行路径
- c - 将相同的元素从 2 个升序排序的链表复制到一个新链表
- python - 如何让我保存的 mp4 与 plot.show() 的输出完全匹配?
- javascript - UI中的Wordpress插件访问方法
- git - Jenkinsfile 和 env.GIT_BRANCH
- c# - 无法将 System.Linq.IOrderedQuerable 转换为 System.Collection.Generic.List 错误
- ios - Obj-c - 如果没有搜索结果,返回表格视图中的 1 个单元格?
- r - 如何使 R 的 philentropy::distance 函数完全安静?
- sql-server - 无法从 Visual Studio 执行 .sql 文件