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