を呼び出すコードが示されていませんがroll
、そこに問題があります。
roll
ただし、引数なしで呼び出せるようにしたい場合は、デフォルトのパラメーター値を使用してそれを行うことができます。
def roll(sides='6'):
デフォルトがもっと複雑な場合 (たとえば、「通常の 6 面ルールを使用する」ではなく「別のルールを使用する」)、デフォルト値を無効なものに設定するだけです。いずれかNone
:
def roll(sides=None):
if sides is None:
return special_rule()
…または、None
有効な引数の場合、カスタム センチネル オブジェクト:
_sentinel = object()
def roll(sides=_sentinel):
if sides is _sentinel:
return special_rule()
補足として、コードはほとんどすべての入力に対して正しいことをしていません。それを見てみましょう:
for i in range(sides == ""):
return random.randint(1,normal_dice)
これは正しいですが、非常に複雑な方法です。の場合sides == ""
、0 から 1 までカウントし、最初のループで 1 から 6 までの数値を返します。それ以外の場合は、0 から 0 までカウントされます。つまり、ループ全体をスキップします。
for i in range(1,int(sides)):
return random.randint(1,int(sides))
ここで、 ifsides
が のように 1 より大きい任意の数である場合"8"
、1 から 8 までカウントしrandint(1, 1)
、最初に戻るので、常に 1 を返し、ループの残りの部分に到達することはありません。1 以下の場合はループをスキップします。
for i in range(int(sides),1):
print("None")
そして、このコードは文字列None
を複数回出力しますが、これはあまり役に立ちません。最終的に関数の最後に落ちて を返しNone
ます。
あなたが望んでいたのは次のようなものだと思います:
def roll(sides='6'):
sides = int(sides)
if sides > 1:
return random.randint(1, sides)
else:
raise ValueError("Can't roll a {}-sided die".format(sides))
if
チェックを外して を実行した場合return random.randint(1, sides)
、1 より小さい数値を渡すと のような例外が発生しValueError: empty range for randrange() (1, 0, 0)
ます。これは、ユーザーが理解するのが少し難しいです。そして、あなたは(私が思うに)元のバージョンでそのケースを明示的にチェックしていました。そこで、より単純な明示的なチェックを入れました。これにより、より適切なエラー メッセージが表示されます: ValueError: can't roll a 0-sided die
.