[英]How to use Assert in this instance?
我正在嘗試使用assert來檢查另一個函數是否正常工作。
在這種情況下,我要測試的功能如下:
def factorial(n):
if type(n) != int or n < 0:
raise ValueError, "\nThis error has been raised because the value inputted was either not an integer or negative."
else:
result = 1
for x in range(n):
result = result*(x+1)
print "\n", n, "factorial is:", result
n = input("\n\n Insert a non-negative integer to take the factorial of: ")
factorial(n)
據我所知,如果我使用assert來檢查n = 1的結果,我將使用:
assert factorial(1) == 1
但這會返回一個斷言錯誤,盡管我已經用n = 1手動檢查了該函數,並且確實返回了1,所以不應該因為條件為真而引發斷言錯誤?
誰能指出為什么我收到斷言錯誤?
也可以使用assert來檢查是否引發ValueError段是否正確?
您的階乘函數可打印結果,但不會返回結果。 這就是斷言失敗的原因。 嘗試這個:
def factorial(n):
if not isinstance(n, int):
raise ValueError('value must be an int')
if n < 0:
raise ValueError('n must be >= 0')
result = 1
for x in range(n):
result = result * (x + 1)
return result # <-- This is the magic line :)
至於問題的第二部分,您似乎偶然發現了單元測試 。
如果您想測試階乘是否有效,我建議您使用適當的單元測試庫,例如doctest或pytest 。 兩者都很容易使用,並且養成在代碼中盡早編寫測試的習慣是很好的。
這是doctest的示例:
def factorial(n):
"""Calculate the factorial of a non-negative integer ``n``.
>>> factorial(1)
1
>>> factorial(4)
24
Negative numbers are not supported and will result in a ValueError:
>>> factorial(-1)
Traceback (most recent call last):
...
ValueError: n must be >= 0
"""
# (Insert original code here)
if __name__ == '__main__':
import doctest
doctest.testmod()
您的所有函數似乎都在打印結果,因此實際函數返回的結果為None,因此assert factorial(1) == 1
實際上被評估為assert None == 1
,這將失敗。 從函數返回值,斷言將不再失敗。
這里的問題是您沒有為assert函數返回值來檢查階乘函數返回的值。
這就是我所做的:僅為了測試,我只是添加了一個return語句以返回結果。
>>> assert factorial(2)==1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
>>> assert factorial(2)==2
>>> assert factorial(1)==1
def factorial(n):
if type(n) != int or n < 0:
raise ValueError, "\nThis error has been raised because the value inputted was either not an integer or negative."
else:
result = 1
for x in range(n):
result = result*(x+1)
return result
n = input("\n\n Insert a non-negative integer to take the factorial of: ")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.