Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 22, 2015 06:46:23

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

PEP 0505 -- None coalescing operators

Сообществу представляется интересный PEP 0505, который предлагает ввести оператор ??



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#2 Сен. 22, 2015 07:05:48

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

PEP 0505 -- None coalescing operators

Годно!



Офлайн

#3 Сен. 22, 2015 09:26:40

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

PEP 0505 -- None coalescing operators

ну вот это вот - безумие

>>> 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

Отредактировано sander (Сен. 22, 2015 09:26:59)

Офлайн

#4 Сен. 29, 2015 08:44:29

i.slepov
Зарегистрирован: 2015-05-28
Сообщения: 53
Репутация: +  5  -
Профиль   Отправить e-mail  

PEP 0505 -- None coalescing operators

По моему лажа и нарушение дзен 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

не катят.

Офлайн

#5 Сен. 29, 2015 11:06:37

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

PEP 0505 -- None coalescing operators

Дзен питона перепишут…

Офлайн

#6 Сен. 29, 2015 14:42:52

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

PEP 0505 -- None coalescing operators

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



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#7 Сен. 29, 2015 15:34:33

i.slepov
Зарегистрирован: 2015-05-28
Сообщения: 53
Репутация: +  5  -
Профиль   Отправить e-mail  

PEP 0505 -- None coalescing operators

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.

Отредактировано i.slepov (Сен. 29, 2015 15:40:04)

Офлайн

#8 Сен. 29, 2015 17:07:37

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

PEP 0505 -- None coalescing operators

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



Офлайн

#9 Сен. 29, 2015 17:08:11

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

PEP 0505 -- None coalescing operators

i.slepov
а читабельность кода страдает
В каком месте она страдает?



Офлайн

#10 Сен. 29, 2015 17:22:10

i.slepov
Зарегистрирован: 2015-05-28
Сообщения: 53
Репутация: +  5  -
Профиль   Отправить e-mail  

PEP 0505 -- None coalescing operators

FishHook
А еще пустой словарь, пустой список, пустое множество, пустой кортеж, объект в методами __bool__() и __len__(), в общем отличать None от bool(obj) реально необходимо.

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

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

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

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

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

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version