Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 11, 2019 11:53:57

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Оценить, понять, простить.

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



Отредактировано FishHook (Апрель 11, 2019 11:54:45)

Офлайн

#2 Апрель 11, 2019 12:16:25

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

Оценить, понять, простить.

> Отлично! Как теперь отличить пустую строку как ошибку и пустую строку как валидный ответ функции?

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



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Онлайн

#3 Апрель 11, 2019 12:38:20

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Оценить, понять, простить.

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

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



Офлайн

#4 Апрель 11, 2019 12:53:23

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

Оценить, понять, простить.

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

Если функция не может вернуть результат и это является ошибкой, то она должна “райзить эксепшен”, а не пытаться замаскировать эту ошибку в виде None.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Онлайн

#5 Апрель 11, 2019 13:29:39

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Оценить, понять, простить.

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

Вот у нас есть некий кеш. Может ли в кеше лежать пустая строка? Да легко. Но мы должны знать, лежит ли там пустая строка, либо кеш еще не разогрет и значение сначала нужно получить другим методом. Что пролохого возвращать из функции None? Да ничего, он для этого и нужен.



Офлайн

#6 Апрель 11, 2019 14:16:10

Babay82
Зарегистрирован: 2019-02-19
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Оценить, понять, простить.

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

 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 
В принципе и тот и тот вариант работает.
Как думаете?

Офлайн

#7 Апрель 11, 2019 14:52:33

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

Оценить, понять, простить.

> Что пролохого возвращать из функции None?

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

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

Раньше было лучше, просто строку “стрипить” нужно:

 >>> "   ".strip()
''



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Онлайн

#8 Апрель 11, 2019 17:31:20

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Оценить, понять, простить.

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

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



Офлайн

#9 Апрель 11, 2019 21:39:33

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

Оценить, понять, простить.

> Ок, как по вашему, правильно ли работает dict.get(key)? Он возвращает значение или None.

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

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

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

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

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



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Онлайн

#10 Апрель 12, 2019 09:48:12

Babay82
Зарегистрирован: 2019-02-19
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Оценить, понять, простить.

Спасибо за подсказку со 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 
Я понимаю что это всё для вас детский сад и очень тривиально, но мне важно ваше мнение

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version