Разделить длинные условные выражения на строки
У меня есть некоторые операторы 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?
Ответы
Ответ 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
Таким образом, вы можете разбить длинную линию тестов и сделать все это более удобочитаемым.
Да, вы можете использовать дополнительные круглые скобки вокруг ваших логических тестов, чтобы разрешать новые строки в тесте, но читаемость сильно страдает, когда вам приходится проходить через несколько строк.