2011-01-19 22 views
11

Tengo una pregunta simple sobre el uso de paréntesis en las sentencias condicionales de Python.paréntesis en Python Conditionals

Los siguientes dos fragmentos funcionan igual, pero me pregunto si esto solo es cierto por su simplicidad;

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

y ahora sin paréntesis

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

¿Alguien podría ayudar a arrojar algo de luz sobre esto? ¿Hay algún caso en el que definitivamente los use?

Respuesta

32

Las otras respuestas que la comparación se lleva a cabo antes de Boole son 100% correcto. Como alternativa (para situaciones como lo has demostrado) también se puede utilizar esto como una manera de combinar las condiciones:

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

que te salva las llamadas separadas a socket.gethostname y hace que sea más fácil agregar adicional posibles valores válidos a medida que su proyecto crece o tiene que autorizar hosts adicionales.

8

Los paréntesis son redundantes en este caso. La comparación tiene una precedencia más alta que los operadores booleanos, por lo que las comparaciones siempre se realizarán primero independientemente de los paréntesis.

Dicho esto, una pauta que vi una vez (tal vez en prácticas de programación C) dice algo como esto:

  1. multiplicación y división primera
  2. La suma y la resta próxima
  3. paréntesis a todo lo demás

(Sí, IIRC omitieron exponenciación)

La idea es que las reglas de precedencia son lo suficientemente misteriosas como para que nadie pueda recordarlas todas, ni el programador original ni el programador de mantenimiento que lee el código, por lo que es mejor hacerlo explícito. Esencialmente, los paréntesis sirven tanto para comunicar el intento al compilador como como documentación para el próximo schmoe que tiene que trabajar en él.

Creo en Python esas dos declaraciones generarán el mismo bytecode por lo que no está perdiendo ninguna eficiencia.

+0

La precedencia del operador de C es rara. Python no lo es. Por lo tanto, en Python, los parientes no están tan a menudo justificados como en C. – delnan

+2

Pero también está la expresión idiomática de python "explícita es mejor que implícita". Si hay una posibilidad de confusión, guárdalos. – Wilduck

+2

Sí, los C son mucho más raros que los de Python. Aún así, tratar de mantenerlos correctos entre los varios idiomas que uno usa puede ser una fuente de confusión en sí mismo. – kindall

5

El paréntesis solo fuerza un orden de las operaciones. Si tiene una parte adicional en su condicional, como 'y', sería aconsejable usar paréntesis para indicar con qué 'o' ese 'y' emparejado.

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

de diferenciar de

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

En Python y en muchos otros lenguajes de programación, no se requieren paréntesis para cada expresión con múltiples operadores. Esto se debe a que los operadores tienen una precedencia definida. Consulte la tabla here (Sección 5.15) para obtener información sobre la precedencia del operador en Python.

Puede dibujar una analogía a la aritmética.Estas expresiones son equivalentes:

5 * 5 + 3 

(5 * 5) + 3 

Si se refiere a añadir tres primeros, entonces es necesario utilizar los paréntesis, así:

5 * (5 + 3) 
0

Tenga una mirada en the manual. Cuanto más alto esté en la lista, el operador se aplicará más tarde. "o" está arriba "==", y por lo tanto, en este caso particular las respuestas son las mismas. Sin embargo, para ser legible, y solo para estar seguro, recomendaría paréntesis.