Вопрос или проблема
Я запускаю 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 адреса. Однако, есть некоторые моменты, которые стоит учесть:
-
Лишние пробелы и символы: Убедитесь, что функция обрабатывает всевозможные вводимые значения, включая пробелы и неверные символы. Возможно, стоит добавить проверку на наличие недопустимых символов перед началом основной проверки.
-
Проверка для пустых строк: Возможно, тест будет включать пустые строки или строки с пробелами, которые ваш код сейчас обрабатывает не совсем правильно.
-
Возврат значений: Вы возвращаете строку
"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
. Убедитесь, что ваш код работает корректно не только для тестовых случаев, но и для всех крайних значений, которые могут быть переданы в качестве ввода. Если проблема сохранится, проверьте, что ваше окружение правильно настроено и что все необходимые библиотеки установлены. Успехов в вашем обучении и дальнейших проектах!