Debug an ISBN Validator - Debug an ISBN Validator

Tell us what’s happening:

I am trying to pass steps 9-13
I have a TypeError in my code with the following input:

Enter ISBN and length:
1530051126,10
Traceback (most recent call last):
File “main.py”, line 84, in
File “main.py”, line 79, in main
File “main.py”, line 2, in validate_isbn
TypeError: len() takes exactly one argument (2 given)

To fix this, I have tried removing 'isbn, ’ from line 2 to keep it at one argument, but after doing that I am still getting a TypeError: object type ‘int’ has no len()

Your code so far

def validate_isbn(isbn, length):
    if len(isbn, length) != length:
        print(f'ISBN-{length} code should be {length} digits long.')
        return

    main_digits = isbn[0:length]
    given_check_digit = isbn[length]
    main_digits_list = [int(digit) for digit in main_digits]

    # Calculate the check digit from other digits
    if length == 10:
        expected_check_digit = calculate_check_digit_10(main_digits_list)
    else:
        expected_check_digit = calculate_check_digit_13(main_digits_list)

    # Check if the given check digit matches with the calculated check digit
    if given_check_digit == expected_check_digit:
        print('Valid ISBN Code.')
    else:
        print('Invalid ISBN Code.')

def calculate_check_digit_10(main_digits_list):
    # Note: You don't have to fully understand the logic in this function.
    digits_sum = 0
    # Multiply each of the first 9 digits by its corresponding weight (10 to 2) and sum up the results
    for index, digit in enumerate(main_digits_list):
        digits_sum += digit * (10 - index)
    # Find the remainder of dividing the sum by 11, then subtract it from 11
    result = 11 - digits_sum % 11
    # The calculation result can range from 1 to 11.
    # If the result is 11, use 0.
    # If the result is 10, use upper case X.
    # Use the value as it is for other numbers.
    if result == 11:
        expected_check_digit = '0'
    elif result == 10:
        expected_check_digit = 'X'
    else:
        expected_check_digit = str(result)
    return expected_check_digit

def calculate_check_digit_13(main_digits_list):
    # Note: You don't have to fully understand the logic in this function.
    digits_sum = 0
    # Multiply each of the first 12 digits by 1 and 3 alternately (starting with 1), and sum up the results
    for index, digit in enumerate(main_digits_list):
        if index % 2 == 0:
            digits_sum += digit * 1
        else:
            digits_sum += digit * 3
    # Find the remainder of dividing the sum by 10, then subtract it from 10
    result = 10 - digits_sum % 10
    # The calculation result can range from 1 to 10.
    # If the result is 10, use 0.
    # Use the value as it is for other numbers.
    if result == 10:
        expected_check_digit = '0'
    else:
        expected_check_digit = str(result)
    return expected_check_digit

def main():
    user_input = input('Enter ISBN and length: ')
    if ',' not in user_input:
        print('Enter comma-separated values.')
    values = user_input.split(',')
    try:
        isbn = values[0]
        length = int(values[1])
    except ValueError:
        print("Length must be a number.")
    isbn = values[0]
    length = int(values[1])
    try:
        isbn = int(values[0])
    except ValueError:
        print('Invalid character was found.')
    if length == 10 or length == 13:
        validate_isbn(isbn, length)
    else:
        print('Length should be 10 or 13.')
    

main()

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36

Challenge Information:

Debug an ISBN Validator - Debug an ISBN Validator

Github Link: freeCodeCamp/curriculum/challenges/english/blocks/lab-isbn-validator/686b9720ee1d032bd77a480a.md at main · freeCodeCamp/freeCodeCamp · GitHub

Hi @MirandaKaylene,

Does it make sense to check the len() of length? Look at the message that is printed. Try print(length) to see what the value of length is.

Happy coding!

So I put: if int(isbn) != length:in line 2 for my code instead? Because when I do that, I get:

Enter ISBN and length:
1530051126,10
ISBN-10 code should be 10 digits long.

But that doesn’t satisfy step 9…

you are not using len anymore there. What do you expect int(isbn) to do?

If i put if int(isbn,length) != length:then I get:

Enter ISBN and length:
1530051126,10
Traceback (most recent call last):
File “main.py”, line 84, in
File “main.py”, line 79, in main
File “main.py”, line 2, in validate_isbn
TypeError: int() can’t convert non-string with explicit base

I’m still getting a TypeError message…

why are you using int now? you can’t transform the ISBN to an integer, it can also contain a letter

also how does transforming it to an integer helps checking how long the string is?

also maybe it does not like trying to transform an integer into an integer because you have this here

meaning validate_isbn already gets an integer, are you sure that’s a good strategy?

also this strategy is going to break for ISBN10 when the last digit is X

If I make the line after try:say isbn = len(values[0])then step 8 doesn’t pass. What is a better approach I can take?

Furthermore, I put the code back to the way it was where line 2 says if len(isbn,length) != length:But if I attempt to keep that, then I get this error message:

TypeError: len() takes exactly one argument (2 given)

So to fix that, I need only 1 argument, right? That’s when I put the len() of isbn instead, meaning I am using if len(isbn) != length: in line 2 of my code, but I am still getting this issue:

Enter ISBN and length:
1530051126,10
Traceback (most recent call last):
File “main.py”, line 84, in
File “main.py”, line 79, in main
File “main.py”, line 2, in validate_isbn
TypeError: object of type ‘int’ has no len()

you can’t use len with an integer, so it gives this error. you need to change your approach here, or inside main, somewhere you need to check the length of the isbn and you need to do that before you change it to an integer

also you need to consider if changing it to an integer at all is a good idea, consider an ISBN10 with the last digit being X, which is completely valid ISBN, but changing that into an integer would give an error

Update to my reply: I’m going to keep playing around with some tryand exceptclauses. I appreciate your guidance and see what you mean about changing to an integer. Thanks!