首页 > 解决方案 > 装饰器可以用来模拟试验吗?

问题描述

有没有一种优雅的方式来使用装饰器来模拟某些功能的试验,可以编辑试验次数?

我希望这会起作用,但事实并非如此。所以我想知道如何解决它。

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)

标签: pythondecorator

解决方案


如果有的话,试验次数应该只是修饰函数的一个参数:

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]

推荐阅读