您沒有向我們展示調用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))
這裏,如果sides
大於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
。
如果用戶輸入爲空,並且調用'roll(the_user_input)',則不會出現此錯誤。問題在於,你在某個地方調用'roll()',而沒有傳遞任何東西。 – abarnert