Форум сайта python.su
RodegastОтлично! Как теперь отличить пустую строку как ошибку и пустую строку как валидный ответ функции? Это же очень плохой совет - возвращать нули в качестве маркера неправильного поведения функции. Это очень простой путь выстрелить себе в ногу, и в этом плане None, null, nil и пр. заполнители по крайней мере избавят от логических ошибок - гораздо труднее отлавливаемых.
Пустую строку
Отредактировано FishHook (Апрель 11, 2019 11:54:45)
Офлайн
> Отлично! Как теперь отличить пустую строку как ошибку и пустую строку как валидный ответ функции?
Чего же тут непонятного? Если нам пришла пустая строка, то это не ошибка, если была ошибка то ловим её через try / except.
Онлайн
Rodegast
Чего же тут непонятного? Если нам пришла пустая строка, то это не ошибка, если была ошибка то ловим её через try / except.
Офлайн
> Ну то есть функция должна в любом случае райзить эксепшен, а не возвращать “” вместо None?
Если функция не может вернуть результат и это является ошибкой, то она должна “райзить эксепшен”, а не пытаться замаскировать эту ошибку в виде None.
Онлайн
RodegastЭто, безусловно, правильно. Но что если None - это не ошибка, а отсутствие состояния?
а не пытаться замаскировать эту ошибку в виде None
Офлайн
В данном случае, наверное, разумнее было-бы так:
def acquaintance(question): """Знакомство с пользователем""" response = None while not response: response = input(question). title() if " " in response: acquaintance(question)
def acquaintance_1(question): response = input(question). title() if not response or " " in response: acquaintance(question) return response
Офлайн
> Что пролохого возвращать из функции None?
Но ведь значение из функции будет кто то использовать и не факт что его догадаются на None проверить, а это приводит к ошибкам. По этому разумно вместо None возвращать объект который не повлияет на дальнейшие вычисления.
> В данном случае, наверное, разумнее было-бы так:
Раньше было лучше, просто строку “стрипить” нужно:
>>> " ".strip() ''
Онлайн
RodegastОк, как по вашему, правильно ли работает dict.get(key)? Он возвращает значение или None. Это же вообще стандартная практика, в языки программирования даже специальный синтаксис вводят типа элвис оператора, чтобы проверять на None.
Но ведь значение из функции будет кто то использовать и не факт что его догадаются на None проверить, а это приводит к ошибкам.
RodegastОткуда функция и её автор знают, повлияет это на вычисления или нет? Как вы наверняка знаете, в стандарте IEEE 754 есть такое специальное значение NaN. Получение NaN, это не ошибка, не возникает исключения. Но и числовых операций вы с ним сделать не сможете. Что это, плохо продуманный стандарт, или необходимость? По вашей логике можно было бы возвращать ноль. Но это неправильно математически и не библиотеке решать, как эту неправильность исправлять, это дело программиста, и вам как программисту придется проверять свои вычисления на NaN.
По этому разумно вместо None возвращать объект который не повлияет на дальнейшие вычисления.
RodegastА документацию читать не надо? Откуда программист вообще знает, какой тип возвращает функция если не из документации? Ну вот там и написано int | None. Все прозрачно как бы.
его догадаются на None проверить
Офлайн
> Ок, как по вашему, правильно ли работает dict.get(key)? Он возвращает значение или None.
Почему он None возвращает? Да потому что он ничего не знает о типе значения из словаря! По этому get правильнее вызывать передавая ему ещё и второй аргумент который как раз и будет являться значением “по умолчанию”.
> Откуда функция и её автор знают, повлияет это на вычисления или нет?
Есть такое понятие как “единица моноида” и вот эту единицу и надо возвращать. Например конкатенация с пустой строкой не изменит исходную строку. А вот с числами немного сложнее т.к. на множестве ℝ можно построить сразу 2 моноида: сложение с 0 и умножение с 1. Вот по этому и сделали NaN.
> А документацию читать не надо? … Ну вот там и написано int | None. Все прозрачно как бы.
Представь что функция возвращала строку и в документации написано что возвращается только строка, но потом функцию переделали, а про документацию забыли.
Онлайн
Спасибо за подсказку со strip, пришлось копнуть сеть, оказалось я почти ничего не знаю о строковых методах.
Для особо упоротых упорных пользователей нарисовал такой вариант.
def acquaintance_1(question): response = input(question). strip(). title() if not response: try: print("Имя не может быть пустой строкой!") acquaintance_1(question) except RecursionError: print("\n\nНа этом мы с вами попрощаемся!") sys.exit() return response
Офлайн