Код CS50 numb3rs возвращает ошибки с pytest в check50, но я не могу определить, в чем дело.

Вопрос или проблема

Я запускаю check50 на код, который следует, однако я получаю ошибку для “correct numb3rs.py passes all test_numb3rs.py checks” с “ожидаемый код выхода 0, не 1” в качестве причины.

Поиск показал, что это может быть связано с тем, что pytest от cs50 подмечает что-то, что я пропустил, но проблема в том, что он не говорит мне, что именно.

Я использую регулярные выражения для этой задачи и да, я, вероятно, мог бы сделать это более эффективно, но я все еще только учусь. Также я не уверен, является ли это проблемой моего регулярного выражения или кода test_numb3rs.

Пожалуйста, взгляните на код и numb3rs.py, и test_numb3rs.py. Буду признателен за любую помощь.

numb3rs.py:

import re

def main():
    print(validate(input("IPv4 Address: ")))

def validate(ip):
    valid = re.search(r"^([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])\.([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])\.([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])\.([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])$", ip.strip())
    if valid:
        return "True"
    else:
        return "False"


if __name__ == "__main__":
    main()

test_numb3rs.py:

from numb3rs import validate

def test_negative():
    assert validate("-1.-1.-1.-1") == "False"

def test_zeros():
    assert validate("0.0.0.0") == "True"

def test_single_digits():
    assert validate("1.1.1.1") == "True"
    assert validate("9.9.9.9") == "True"
    assert validate("1.2.3.4") == "True"
    assert validate("0.1.2.9") == "True"

def test_double_digits():
    assert validate("10.10.10.10") == "True"
    assert validate("99.99.99.99") == "True"
    assert validate("10.99.50.75") == "True"

def test_triple_digits():
    assert validate("100.100.100.100") == "True"
    assert validate("255.255.255.255") == "True"
    assert validate("100.200.254.255") == "True"

def test_combos():
    assert validate("0.1.10.100") == "True"
    assert validate("10.10.99.255") == "True"
    assert validate("255.99.10.0") == "True"

def test_outOfRange():
    assert validate("255.255.255.256") == "False"

def test_NaN():
    assert validate("cat") == "False"

def test_extra_dot():
    assert validate("10.10.10..10") == "False"

def test_not_a_dot():
    assert validate("1.2.3,4") == "False"

def test_tooFewNums():
    assert validate("100.100.100") == "False"

def test_tooManyNums():
    assert validate("100.100.100.100.100") == "False"

def test_whitespace():
    assert validate("  10.10.10.10  ") == "True"

def test_validButWithInvalidLandR():
    assert validate("cat100.100.100.100") == "False"
    assert validate("100.100.100.100cat") == "False"

Ответ или решение

Ваша проблема с запуском тестов в CS50, связанная с кодом numb3rs.py, может быть вызвана несколькими факторами. Вы упомянули, что используете регулярные выражения, и есть вероятность, что ваш код не учитывает некоторые крайние случаи, что приводит к сбоям при тестировании. Давайте разберемся с вашим кодом и посмотрим, как его можно улучшить.

Ошибка в коде: анализ

Сначала взглянем на регулярное выражение, которое вы используете в функции validate(ip):

valid = re.search(r"^([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])\.([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])\.([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])\.([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])$", ip.strip())

Ваше регулярное выражение выглядит правильным для проверки формата IPv4 адреса. Однако, есть некоторые моменты, которые стоит учесть:

  1. Лишние пробелы и символы: Убедитесь, что функция обрабатывает всевозможные вводимые значения, включая пробелы и неверные символы. Возможно, стоит добавить проверку на наличие недопустимых символов перед началом основной проверки.

  2. Проверка для пустых строк: Возможно, тест будет включать пустые строки или строки с пробелами, которые ваш код сейчас обрабатывает не совсем правильно.

  3. Возврат значений: Вы возвращаете строку "True" или "False". Обычно в Python для логических значений используются булевы типы True и False. Это может привести к недопониманию в тестах. Возможно, вам стоит вернуть именно булевы значения. Например:

    return True if valid else False

Рекомендации по коду

Попробуйте внести следующие изменения в ваш код numb3rs.py:

import re

def main():
    print(validate(input("IPv4 Address: ").strip()))

def validate(ip):
    if not ip or re.search(r"[^\d\.]", ip):  # Проверка на недопустимые символы
        return False

    valid = re.search(r"^([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])\.([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])\.([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])\.([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])$", ip)
    return bool(valid)  # Использование булевого значения

if __name__ == "__main__":
    main()

Заключение

После внесения изменений попробуйте снова запустить check50. Убедитесь, что ваш код работает корректно не только для тестовых случаев, но и для всех крайних значений, которые могут быть переданы в качестве ввода. Если проблема сохранится, проверьте, что ваше окружение правильно настроено и что все необходимые библиотеки установлены. Успехов в вашем обучении и дальнейших проектах!

Оцените материал
Добавить комментарий

Капча загружается...