2013-07-11 3 views
-5

Когда я проверяю ISBN (DIGIT) с моим кодом: check_digit_13 (2000003294107)Python AssertionError

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). Вам придется отлаживать, что такое поле [0] ', и выяснить, почему в нем меньше или больше 12 символов. –

ответ

16
  • Стоп.
  • Подумайте.
  • Что переводчик пытается вам рассказать?
  • Утверждение об ошибке?
  • Какое утверждение?
  • В вашем коде есть только один.
  • След даже показывает вам, какой из них.

Проверьте входную функцию. Это строка? Затем подсчитайте символы. Сколько? 12? Я подсчитал 13.

+2

Я чувствую, что это должен быть классический ответ. Он применяется (с минимальной модификацией) примерно до 50% вопросов, имея форму «Я получил это исключение, которое говорит мне, что не так, и где, как мне его исправить?» – Marcin

5

assert len(isbn) == 12 должно быть assert len(isbn) == 13. В конце концов, текущие коды ISBN составляют 13 цифр, и это ваш пример ввода. Возможно, вы запутались, потому что индексы начинаются с 0, но длина равна длине, поэтому она равна 13.

Смежные вопросы