Найти - Пользователи
Полная версия: PEP 0505 -- None coalescing operators
Начало » Обсуждение новостей » PEP 0505 -- None coalescing operators
1 2 3 4 5
JOHN_16
Сообществу представляется интересный PEP 0505, который предлагает ввести оператор ??
FishHook
Годно!
sander
ну вот это вот - безумие
>>> title = 'My Title'
>>> title.upper()
'MY TITLE'
>>> title = None
>>> title.upper()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'upper'
>>> title?.upper()
None
>>> person = {'name': 'Mark', 'age': 32}
>>> person['name']
'Mark'
>>> person = None
>>> person['name']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not subscriptable
>>> person?['name']
None
i.slepov
По моему лажа и нарушение дзен python.

>>> title = 'My Title'
>>> title or 'Default title'
'My Title'
>>> title = None
>>> title or 'Default title'
'Default title'

Отмазки вроде:

Similar behavior can be achieved with the or operator, but or checks whether its left operand is false-y, not specifically None . This can lead to surprising behavior. Consider the scenario of computing the price of some products a customer has in his/her shopping cart:

>>> price = 100
>>> requested_quantity = 5
>>> default_quantity = 1
>>> (requested_quantity or default_quantity) * price
500
>>> requested_quantity = None
>>> (requested_quantity or default_quantity) * price
100
>>> requested_quantity = 0
>>> (requested_quantity or default_quantity) * price # oops!
100

не катят.
Shaman
Дзен питона перепишут…
JOHN_16
i.slepov
вообще катят, ибо я не однократно попадался. Но соглашусь что пока что выглядит…ну не привычно
i.slepov
JOHN_16
вообще катят, ибо я не однократно попадался.

Да вот проблему “попадания” синтаксисом не решить, а читабельность кода страдает, ведь по сути это очень узкий специальный оператор для операции “или” отличающий число 0 от None. А что будет если там False, “” и т. п. ?
Потом посмотрим предложение:
>>> title = 'My Title'
>>> title.upper()
'MY TITLE'
>>> title = None
>>> title.upper()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'upper'
>>> title?.upper()
None
В первом случае мы получим понятный TraceBack, который мы можем явным образом обработать, во втором случае при наращивание кодовой базы со временем может случиться трудно выявляемая логическая ошибка.

В общем моё мнение не нужно превращать Python в Perl.
FishHook
i.slepov
“или” отличающий число 0 от None
А еще пустой словарь, пустой список, пустое множество, пустой кортеж, объект в методами __bool__() и __len__(), в общем отличать None от bool(obj) реально необходимо.
i.slepov
со временем может случиться трудно выявляемая логическая ошибка
Вот как раз таки трудно выявляемая логическая ошибка у вас произойдет, когда раз в полгода программа
будет получать в каком-то месте неожиданный для вас ноль и выполнять совсем не ту ветку кода, которую вы планировали.
FishHook
i.slepov
а читабельность кода страдает
В каком месте она страдает?
i.slepov
FishHook
А еще пустой словарь, пустой список, пустое множество, пустой кортеж, объект в методами __bool__() и __len__(), в общем отличать None от bool(obj) реально необходимо.

При этом прямо в документе указано как это сейчас работает. По сути это банальный сахар.

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

Да нет же, при текущем раскладе программа честно упадет с выводом Traceback.

FishHook
В каком месте она страдает?

Вы Perl видели? Этот оператор оттуда, давайте еще десяток таких притащим и к Python v4.0 переименуем его в долгожданный Perl v6.0 .

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