Подтвердить что ты не робот

Разделить длинные условные выражения на строки

У меня есть некоторые операторы if:

def is_valid(self):
    if (self.expires is None or datetime.now() < self.expires)
    and (self.remains is None or self.remains > 0):
        return True
    return False

Когда я набираю эти выражения, мой Vim автоматически перемещает and в новую строку с тем же отступом, что и строка if. Я пробую больше комбинаций отступа, но проверка всегда говорит о недопустимом синтаксисе. Как построить long if's?

4b9b3361

Ответ 1

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

if (1+1==2
  and 2 < 5 < 7
  and 2 != 3):
    print 'yay'

Что касается фактического количества используемых пробелов, Руководство по стилю Python не дает ничего, кроме как дает некоторые идеи:

# No extra indentation.
if (this_is_one_thing and
    that_is_another_thing):
    do_something()

# Add a comment, which will provide some distinction in editors
# supporting syntax highlighting.
if (this_is_one_thing and
    that_is_another_thing):
    # Since both conditions are true, we can frobnicate.
    do_something()

# Add some extra indentation on the conditional continuation line.
if (this_is_one_thing
        and that_is_another_thing):
    do_something()

Ответ 2

помещают строки в скобки if ((....) and (...)):

Ответ 3

Вы можете инвертировать тесты и возвращать False в подмножествах теста:

def is_valid(self):
    if self.expires is not None and datetime.now() >= self.expires:
        return False
    if self.remains is not None and self.remains <= 0:
        return False
    return True

Таким образом, вы можете разбить длинную линию тестов и сделать все это более удобочитаемым.

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