python - 装饰器可以用来模拟试验吗?
问题描述
有没有一种优雅的方式来使用装饰器来模拟某些功能的试验,可以编辑试验次数?
我希望这会起作用,但事实并非如此。所以我想知道如何解决它。
from functools import wraps
from random import randint
def DiceRoll(dice_size=6):
return randint(1,dice_size)
def trials(func):
@wraps(func)
def wrapper(*args, num_trials, **kwargs):
results = []
for _ in range(num_trials):
result = func(*args, **kwargs)
results.append(result)
return results
return wrapper
@trials
def DiceRolls(dice_size=6, num_trials):
return DiceRoll(dice_size)
DiceRolls(num_trials)
解决方案
如果有的话,试验次数应该只是修饰函数的一个参数:
def trials(func):
@wraps(func)
def wrapper(*args, num_trials=1,**kwargs):
return [func(*args, **kwargs) for _ in range(num_trials)]
return wrapper
def DiceRoll(dice_size=6):
return randint(1,dice_size)
@trials
def DiceRolls(dice_size=6):
return DiceRoll(dice_size)
>>> DiceRolls()
[5]
>>> DiceRolls(num_trials=3)
[1, 1, 1]
>>> DiceRolls(num_trials=5)
[1, 5, 6, 1, 6]
>>> DiceRolls(num_trials=5, dice_size=3)
[2, 1, 1, 3, 1]
推荐阅读
- c++ - 如何创建一个函数,该函数将另一个函数作为具有未知数量参数的参数?
- soap - 获取 nlobjSearchFilter 包含无效的运算符,或语法不正确:internalid。尝试添加 VendorBill 时
- python - 在 2 个相同形状的 numpy 数组上按列应用 lowess() 函数
- azure - Azure App Gateway v2 - Nginx 标头或 cookie 太大
- ionic-framework - 在 ionic 4 中发出警报呈现默认日期
- actionscript-3 - AS3 全屏放大和缩小以实现响应功能
- dart - 缩放和可拖动的独立人物
- java - 不应分配参数“num”(错误)
- android - 使用引用资源 ID 的声音 URI 时,Android 通知通道声音停止工作
- login - 在 PHP 中验证密码哈希