2011-05-29 24 views
50

Al código en otros idiomas, se le a veces crear un ámbito de bloque, así:bloque en Python

statement 
... 
statement 
{ 
    statement 
    ... 
    statement 
} 
statement 
... 
statement 

Uno de los objetivos (de muchos) es mejorar la legibilidad del código: mostrar que ciertas declaraciones forman una unidad lógica o que ciertas variables locales se usan solo en ese bloque.

¿Hay una manera idiomática de hacer lo mismo en Python?

+1

'Un propósito (de muchos) es mejorar la legibilidad del código' - código de Python, escrito correctamente (es decir, siguiendo el [zen de python] (http://www.python.org/dev/peps/pep-0020) /)) no necesitaría tal aderezo para ser legible. De hecho, es una de las (muchas) cosas que me gustan de Python. –

+0

He intentado jugar con la instrucción '__exit__' y' with', cambiando 'globals()' pero fallé. –

+0

sería muy útil definir la duración variable, conectado a la adquisición de recursos –

Respuesta

50

No, no hay soporte de idioma para crear el alcance del bloque. Los únicos medios para crear alcance son funciones, clases o módulos.

+0

@Alaya Sí, y varios otros idiomas también. Pero la pregunta era específicamente sobre Python. – ThomasH

+0

Lo siento, leí mal su respuesta ya que "no hay un lenguaje que admita el análisis de bloques" ... – Alaya

+0

@Alaya, sí, ¿es posible que elimine su comentario? – JoelFan

30

La manera idiomática en Python es mantener sus funciones cortas. ¡Si crees que lo necesitas, refactoriza tu código! :)

Python crea un nuevo ámbito para cada módulo, clase, función o expresión de generador (en Python 3.x también para listas de comprensión). Aparte de esto, no hay ámbitos anidados dentro de las funciones.

+3

"Lo más importante en la programación es la capacidad de darle un nombre a algo. Lo segundo más importante es no tener que darle un nombre a algo". En su mayor parte, Python requiere que los ámbitos (para variables, etc.) reciban nombres. En este sentido, Python variables la segunda prueba más importante. –

+5

Lo más importante en programación es la capacidad de administrar las dependencias de su aplicación y administrar ámbitos de bloques de código. Los bloques anónimos le permiten limitar el tiempo de vida de las devoluciones de llamada, mientras que, de lo contrario, sus devoluciones de llamadas solo se usan una vez, pero permanecen vigentes durante el programa, esto causa un desorden global en el alcance y daña la legibilidad del código. – Dmitry

2

Puede hacer algo similar a un alcance de bloque de C++ en Python al declarar una función dentro de su función y llamarla inmediatamente. Por ejemplo:

def my_func(): 
    shared_variable = calculate_thing() 

    def do_first_thing(): 
     ... = shared_variable 
    do_first_thing() 

    def do_second_thing(): 
     foo(shared_variable) 
     ... 
    do_second_thing() 

Si no está seguro de por qué es posible que desee hacer esto, entonces this video podría convencerte.

El principio básico es abarcar todo tan estrechamente como sea posible sin introducir ningún tipo de "basura" (tipos/funciones adicionales) en un ámbito más amplio que el absolutamente necesario. Nada más quiere usar el método do_first_thing() por ejemplo, así que no debería t ser delimitado fuera de la función de llamada.

Cuestiones relacionadas