我可以有两组论据吗

问题描述 投票:0回答:1

我正在尝试用Python制作一个骰子滚筒。 代码是:

class die:
    def __init__(self, num:int, die:int | str, mod:int=0, keep:int=None):
        keep = keep if keep != None else num
        if keep > num:  keep = num
        self.num, self.die, self.mod, self.keep = num, die, mod, keep
    def __repr__(self) -> str:
        mod = f"+{self.mod}" if self.mod > 0 else f"-{abs(self.mod)}" if self.mod < 0 else ''
        keep = f"{f"{self.keep}kh" if self.keep > 0 else f"{abs(self.keep)}kl" if self.keep < 0 else ''}"
        return f"{keep}{self.num}d{self.die}{mod}"
    def roll(self) -> int:
        log = []
        die = range(0, self.num)
        for _ in die:
            log += [rand.randint(0, (10 if self.die == '%' else int(self.die)) * (10 if self.die == '%' else 1))]
        if self.keep > 0:
            log = [log] + [heapq.nlargest(self.keep, log)]
        elif self.keep < 0:
            log = [log] + [heapq.nsmallest(abs(self.keep), log)]
        final = sum(log[1], self.mod)
        return final
#Sorry if my code is hard to read.

我想添加传递骰子表达式的功能(例如:

4d6+3
)以及单独的选项。如果只提供一个参数,有什么方法可以传递一个单独的参数。例如:

def __init__(self, num:int, die:int | str, mod:int=0, keep:int=None OR expression:str)
python function arguments dice
1个回答
1
投票

__init__
就这样就好了。将字符串解析为合适的参数的工作应该由 class 方法来处理。

类似的东西

class die:
    def __init__(self, num:int, die:int | str, mod:int=0, keep:int=None):
        ...

    @classmethod
    def from_description(cls, descr: str) -> die:
        num, die, mod = re.match("\d+d\d+\+\d+").groups()
        return cls(num, die, mod)

d = die.from_description("4d6+3")
© www.soinside.com 2019 - 2024. All rights reserved.