Круглые скобки в условиях Python

У меня есть простой вопрос относительно использования круглых скобок в условных операторах Python.

Следующие два фрагмента работают одинаково, но мне интересно, правда ли это только из-за простоты,

>>> import os, socket
>>> if ((socket.gethostname() == "bristle") or (socket.gethostname() == "rete")):
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG

и теперь без круглых скобок

>>> import os, socket
>>> if socket.gethostname() == "bristle" or socket.gethostname() == "rete":
...     DEBUG = False
... else:
...     DEBUG = True
... 
>>> DEBUG

Может ли кто-нибудь помочь пролить свет на это? Являются ли их случаи, когда я определенно их использую?

Ответ 1

Другие ответы, что сравнение происходит до того, как Boolean на 100% правильны. В качестве альтернативы (для ситуаций, подобных тому, что вы продемонстрировали) вы также можете использовать это как способ сочетания условий:

if socket.gethostname() in ('bristle', 'rete'):
  # Something here that operates under the conditions.

Это избавляет вас от отдельных вызовов socket.gethostname и упрощает добавление дополнительных допустимых значений по мере роста вашего проекта или для авторизации дополнительных хостов.

Ответ 2

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

Тем не менее, руководство, которое я когда-то видел (возможно, в Практическом программировании на С), сказал следующее:

  • Умножение и деление сначала
  • Добавление и вычитание следующего
  • Скобки вокруг всего остального

(Да, IIRC они исключили возведение в степень!)

Идея состоит в том, что правила приоритета достаточно загадочны, и никто не должен их помнить, ни первоначальный программист, ни программист по обслуживанию, читающий код, поэтому лучше сделать его явным. По сути, круглые скобки служат как для передачи намерения компилятору, так и для документации для следующего schmoe, который должен работать над ним.

Я верю в Python, что эти два оператора будут генерировать один и тот же байт-код, чтобы вы даже не теряли эффективности.

Ответ 3

Скобки просто заставляют порядок операций. Если бы у вас была дополнительная роль в вашем условном выражении, например "и", было бы целесообразно использовать скобки для указания того, к какому 'или' этому 'и' в паре с.

if (socket.gethostname() == "bristle" or socket.gethostname() == "rete") and var == condition:
    ...

Чтобы отличить от

if socket.gethostname() == "bristle" or (socket.gethostname() == "rete" and var == condition):
    ...

Ответ 4

В Python и многих других языках программирования скобки не требуются для каждого выражения с несколькими операторами. Это связано с тем, что операторы имеют определенный приоритет. См. Таблицу здесь (раздел 5.15) для получения информации о приоритете оператора в Python.

Вы можете провести аналогию с арифметикой. Эти выражения эквивалентны:

5 * 5 + 3

(5 * 5) + 3

Если вы хотите добавить три первых, то вам нужно использовать круглые скобки, например:

5 * (5 + 3)

Ответ 5

Посмотрите руководство. Чем выше вы находитесь в списке, оператор будет применяться позже. "или" находится выше "==", и поэтому в этом конкретном случае ответы одинаковы. Однако для удобочитаемости и, конечно, я бы рекомендовал скобки.