Найти - Пользователи
Полная версия: Нуждаюсь в codereview.
Начало » Python для новичков » Нуждаюсь в codereview.
1 2 3
py.user.next
FishHook
Проверку на None делают, когда объект может быть нулем, пустой строкой, пустым списком, т.д. и эту ситуацию нужно отделить от случая, когда состояние объекта еще не определено

Метод __bool__ отвечает за поведение объекта в логическом контексте. Он может и полную строку не отличать от пустой.

Там может быть сложный объект. Например, матрица считается истинной, если её главная диагональ заполнена единицами. Или сетевое подключение считается истинным, если в буфере остаётся заданное число блоков.

Вот пример, когда None и __bool__ никак не связаны по смыслу:
>>> class Int(int):
...     def __bool__(self):
...         return self % 4 == 0
... 
>>> def f(n):
...     if n > 3:
...         x = Int(n + 2)
...         globals()['x'] = x
...         return x
... 
>>> bool(f(5)), f(5) is not None
(False, True)
>>> x
7
>>> bool(f(6)), f(6) is not None
(True, True)
>>> x
8
>>>

FishHook
проверять args на длину, ИМХО, говнокод.

Допустим, там не простой список аргументов, а типа “умный”:

>>> class Args(list):
...     def __bool__(self):
...         return len(self) > 3
... 
>>> args = Args(('a', 'b', 'c'))
>>> 
>>> if args:
...     print('ok', args)
... else:
...     print('no', args, len(args))
... 
no ['a', 'b', 'c'] 3
>>> 
>>> args.append('d')
>>> 
>>> if args:
...     print('ok', args)
... else:
...     print('no', args, len(args))
... 
ok ['a', 'b', 'c', 'd']
>>>

В одном случае подойдёт логическая проверка, а вдругом - проверка содержимого.

FishHook
Теоретически в объекте может быть переопределён __len__.

Может быть, но эта теория слабее теории переопределения __bool__. Второе имеет смысл, а первое?
FishHook
py.user.next
Допустим, там не простой список аргументов, а типа “умный”
Там это где? Посмотрите еще раз на мой пример
def  foo(*args):
    print bool(args)
Я не представляю, как Вы туда хитрый список сувать собираетесь. Сорри, но примеры искусственные.
Когда программист не знает, с какими переменными он работает - это отдельный случай, скажем так - не стандартный.
ZZZ
likin, читай тут: https://docs.python.org/3.4/library/optparse.html
Deprecated since version 3.2: The optparse module is deprecated and will not be developed further; development will continue with the argparse module.

py.user.next, конечно, нужно действовать в зависимости от конкретной ситуации, но в общем случае FishHook прав.
py.user.next
FishHook
Там это где?

Вот тут . Там у него аргументы получаются из метода:
(options, args) = parser.parse_args()
Так вот, эти куски кода - получение аргументов и проверка их количества - не связаны между собой. То есть между ними может что-то появиться, что-нибудь типа Args, приведённого выше. И тогда, если там простая логическая проверка, её придётся переписывать на проверку длины. А если там проверка длины, то её не придётся переписывать.

Да, вычисление длины там может не прокатить (если там генератор аргументов, к примеру), но это будет лучше, чем просто логическая проверка, которая может дать ложный результат.

>>> g = (i for i in ())
>>> len(g)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'generator' has no len()
>>> bool(g)
True
>>>

Это вот то, в чём прав kise97, утверждая, что len() лучше.

FishHook
Посмотрите еще раз на мой пример
Там будет кортеж всегда. Речь-то идёт про абстрактные аргументы.

ZZZ
но в общем случае FishHook прав
Он имеет в виду аргументы в виде списка или кортежа. Я имею в виду аргументы, представленные каким-то особенным объектом.
FishHook
py.user.next
Он имеет в виду аргументы в виде списка или кортежа. Я имею в виду аргументы, представленные каким-то особенным объектом.
Когда я вижу в коде args, я знаю чего от меня ждут.
Может быть, кто-то пишет такие программы, что args у них означает странный объект с переопределенным __bool__, может быть, кто-то надевает штаны через голову, может быть у кого-то принято вместо “здравствуйте” говорить “трям” - бога ради. При чем тут питон и правила хорошего кода?
ZZZ
py.user.next
Он имеет в виду аргументы в виде списка или кортежа. Я имею в виду аргументы, представленные каким-то особенным объектом.
Какой бы ни был особый этот объект, если его __bool__ ведёт себя странно, то нафиг он такой красивый не нужен. Это просто ошибка проектирования и ничего больше. В подавляющем большенстве случаев, bool(len(obj)) должно быть равно bool(obj).
py.user.next
ZZZ
В подавляющем большенстве случаев, bool(len(obj)) должно быть равно bool(obj).

Так __len__ может вообще не быть у объекта. То есть __bool__ вполне может что-то означать, чтобы это можно было использовать в циклах и условиях, тогда как __len__ может быть просто невычислим для объекта.

ZZZ
Какой бы ни был особый этот объект, если его __bool__ ведёт себя странно, то нафиг он такой красивый не нужен.

Что странного в том, что ты руками не хочешь проверять истинность списка аргументов?

Вот тебе список sys.argv, проверь, что для него соблюдается ряд условий. А если не соблюдается, то надо соблюсти.

Вот я напишу:
args = Args(sys.argv)
if not args:
    args.norm()

Причём никакой __len__ там роли не играет.
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