【问题标题】:Can decorators be used to simulate trials?装饰器可以用来模拟试验吗?
【发布时间】:2026-01-05 14:10:02
【问题描述】:

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

我希望这会起作用,但它没有。所以我想知道如何解决它。

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)

【问题讨论】:

  • 我明白为什么它不起作用(行:result = func(*args, **kwargs),但是有解决方法吗?
  • num_trials 不应是def DiceRolls参数,而必须是修饰调用的参数def DiceRolls(dice_size=6):DiceRolls(num_trials=5).

标签: python decorator


【解决方案1】:

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

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]

【讨论】:

  • 忘了说谢谢,这让我明白了。
最近更新 更多