2013-07-11 48 views
-5

當我檢查ISBN(位)與我的代碼:check_digit_13(2000003294107)Python的Asse田

def check_digit_13(isbn): 
    assert len(isbn) == 12 
    sum = 0 
    for i in range(len(isbn)): 
     c = int(isbn[i]) 
     if i % 2: w = 3 
     else: w = 1 
     sum += w * c 
    r = 10 - (sum % 10) 
    if r == 10: return '0' 
    else: return str(r) 

的錯誤:

Traceback (most recent call last): 
    File "parser.py", line 16, in <module> 
    lk.run(document) 
    File "/data/www/crons/lk/parser.py", line 33, in run 
    field = lkmapper.all(row, document) 
    File "/data/www/crons/mappers/lk.py", line 5, in all 
    print isbn.check_digit_13(field[0]) 
    File "/data/www/crons/libs/isbn.py", line 13, in check_digit_13 
    assert len(isbn) == 12 
AssertionError 
+2

你不可能用'check_digit_13(2000003294107)'調用該函數,因爲這是一個整數;該異常將會不同(將引發'TypeError')。你必須調試'field [0]'是什麼,並找出爲什麼有少於或多於12個字符。 –

回答

16
  • 停止。
  • 想想。
  • 口譯員試圖告訴你什麼?
  • 聲明錯誤?
  • 哪個斷言?
  • 代碼中只有一個。
  • 追蹤甚至顯示你哪一個。

檢查您的功能的輸入。它是一個字符串嗎?然後計數字符。多少? 12?我數了13.

+2

我覺得這應該是一個經典的答案。它適用於(只需很少修改)大約50%的問題,形式爲「我得到了這個例外,它告訴我什麼是錯的,在哪裏,我該如何解決它?」 – Marcin

5

assert len(isbn) == 12應該是assert len(isbn) == 13。畢竟,當前的ISBN編碼長度爲13位數字,您的示例輸入也是如此。也許你很困惑,因爲索引從0開始,但長度是長度,所以它是13.