Форум сайта python.su
857
FishHook
Проверку на None делают, когда объект может быть нулем, пустой строкой, пустым списком, т.д. и эту ситуацию нужно отделить от случая, когда состояние объекта еще не определено
>>> 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__.
Отредактировано py.user.next (Июль 16, 2014 08:12:42)
Офлайн
568
py.user.nextТам это где? Посмотрите еще раз на мой пример
Допустим, там не простой список аргументов, а типа “умный”
def foo(*args): print bool(args)
Офлайн
26
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.
Офлайн
857
FishHook
Там это где?
(options, args) = parser.parse_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 >>>
FishHookТам будет кортеж всегда. Речь-то идёт про абстрактные аргументы.
Посмотрите еще раз на мой пример
ZZZОн имеет в виду аргументы в виде списка или кортежа. Я имею в виду аргументы, представленные каким-то особенным объектом.
но в общем случае FishHook прав
Отредактировано py.user.next (Июль 16, 2014 12:32:48)
Офлайн
568
py.user.nextКогда я вижу в коде args, я знаю чего от меня ждут.
Он имеет в виду аргументы в виде списка или кортежа. Я имею в виду аргументы, представленные каким-то особенным объектом.
Офлайн
26
py.user.nextКакой бы ни был особый этот объект, если его __bool__ ведёт себя странно, то нафиг он такой красивый не нужен. Это просто ошибка проектирования и ничего больше. В подавляющем большенстве случаев, bool(len(obj)) должно быть равно bool(obj).
Он имеет в виду аргументы в виде списка или кортежа. Я имею в виду аргументы, представленные каким-то особенным объектом.
Офлайн
857
ZZZ
В подавляющем большенстве случаев, bool(len(obj)) должно быть равно bool(obj).
ZZZ
Какой бы ни был особый этот объект, если его __bool__ ведёт себя странно, то нафиг он такой красивый не нужен.
args = Args(sys.argv) if not args: args.norm()
Отредактировано py.user.next (Июль 17, 2014 21:46:37)
Офлайн