Найти - Пользователи
Полная версия: Оценить, понять, простить.
Начало » Python для новичков » Оценить, понять, простить.
1 2 3 4
FishHook
Rodegast
Пустую строку
Отлично! Как теперь отличить пустую строку как ошибку и пустую строку как валидный ответ функции? Это же очень плохой совет - возвращать нули в качестве маркера неправильного поведения функции. Это очень простой путь выстрелить себе в ногу, и в этом плане None, null, nil и пр. заполнители по крайней мере избавят от логических ошибок - гораздо труднее отлавливаемых.
Rodegast
> Отлично! Как теперь отличить пустую строку как ошибку и пустую строку как валидный ответ функции?

Чего же тут непонятного? Если нам пришла пустая строка, то это не ошибка, если была ошибка то ловим её через try / except.
FishHook
Rodegast
Чего же тут непонятного? Если нам пришла пустая строка, то это не ошибка, если была ошибка то ловим её через try / except.

Ну то есть функция должна в любом случае райзить эксепшен, а не возвращать “” вместо None?

Rodegast
> Ну то есть функция должна в любом случае райзить эксепшен, а не возвращать “” вместо None?

Если функция не может вернуть результат и это является ошибкой, то она должна “райзить эксепшен”, а не пытаться замаскировать эту ошибку в виде None.
FishHook
Rodegast
а не пытаться замаскировать эту ошибку в виде None
Это, безусловно, правильно. Но что если None - это не ошибка, а отсутствие состояния?
У нас есть три возможности:
1) функция возвращает строку, которая может быть в том числе пустой строкой.
2) функция возвращает None, если состояние не задано.
3) функция райзит ошибку.

Вот у нас есть некий кеш. Может ли в кеше лежать пустая строка? Да легко. Но мы должны знать, лежит ли там пустая строка, либо кеш еще не разогрет и значение сначала нужно получить другим методом. Что пролохого возвращать из функции None? Да ничего, он для этого и нужен.
Babay82
В данном случае, наверное, разумнее было-бы так:
 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 
В принципе и тот и тот вариант работает.
Как думаете?
Rodegast
> Что пролохого возвращать из функции None?

Но ведь значение из функции будет кто то использовать и не факт что его догадаются на None проверить, а это приводит к ошибкам. По этому разумно вместо None возвращать объект который не повлияет на дальнейшие вычисления.

> В данном случае, наверное, разумнее было-бы так:

Раньше было лучше, просто строку “стрипить” нужно:
 >>> "   ".strip()
''
FishHook
Rodegast
Но ведь значение из функции будет кто то использовать и не факт что его догадаются на None проверить, а это приводит к ошибкам.
Ок, как по вашему, правильно ли работает dict.get(key)? Он возвращает значение или None. Это же вообще стандартная практика, в языки программирования даже специальный синтаксис вводят типа элвис оператора, чтобы проверять на None.

Rodegast
По этому разумно вместо None возвращать объект который не повлияет на дальнейшие вычисления.
Откуда функция и её автор знают, повлияет это на вычисления или нет? Как вы наверняка знаете, в стандарте IEEE 754 есть такое специальное значение NaN. Получение NaN, это не ошибка, не возникает исключения. Но и числовых операций вы с ним сделать не сможете. Что это, плохо продуманный стандарт, или необходимость? По вашей логике можно было бы возвращать ноль. Но это неправильно математически и не библиотеке решать, как эту неправильность исправлять, это дело программиста, и вам как программисту придется проверять свои вычисления на NaN.
Rodegast
его догадаются на None проверить
А документацию читать не надо? Откуда программист вообще знает, какой тип возвращает функция если не из документации? Ну вот там и написано int | None. Все прозрачно как бы.
Rodegast
> Ок, как по вашему, правильно ли работает dict.get(key)? Он возвращает значение или None.

Почему он None возвращает? Да потому что он ничего не знает о типе значения из словаря! По этому get правильнее вызывать передавая ему ещё и второй аргумент который как раз и будет являться значением “по умолчанию”.

> Откуда функция и её автор знают, повлияет это на вычисления или нет?

Есть такое понятие как “единица моноида” и вот эту единицу и надо возвращать. Например конкатенация с пустой строкой не изменит исходную строку. А вот с числами немного сложнее т.к. на множестве ℝ можно построить сразу 2 моноида: сложение с 0 и умножение с 1. Вот по этому и сделали NaN.

> А документацию читать не надо? … Ну вот там и написано int | None. Все прозрачно как бы.

Представь что функция возвращала строку и в документации написано что возвращается только строка, но потом функцию переделали, а про документацию забыли.
Babay82
Спасибо за подсказку со 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 
Я понимаю что это всё для вас детский сад и очень тривиально, но мне важно ваше мнение
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB