¿Cómo se pueden crear nuevos ámbitos en python?

En muchos idiomas (y lugares) hay una buena práctica de crear ámbitos locales mediante la creación de un bloque como este .

void foo() { ... Do some stuff ... if(TRUE) { char a; int b; ... Do some more stuff ... } ... Do even more stuff ... } 

¿Cómo puedo implementar esto en Python sin obtener el error de sangría inesperado y sin usar algún tipo de si es True: trucos?

En Python, el scope es de tres tipos: global, local y de clase. Puede crear diccionarios especializados ‘scope’ para pasar a exec / eval (). Además, puede usar ámbitos nesteds (definiendo una función dentro de otra). He encontrado que esto es suficiente en todo mi código.

Como ya lo dijo Douglas Leeder, la razón principal para usarlo en otros idiomas es el scope variable y eso no sucede en Python. Además, Python es el lenguaje más legible que he usado. Iría en contra de la legibilidad de hacer algo como trucos si-verdaderos (que usted dice que quiere evitar). En ese caso, creo que la mejor opción es refactorizar su código en múltiples funciones o usar un solo ámbito. Creo que los ámbitos disponibles en Python son suficientes para cubrir cualquier eventualidad, por lo que el scope local no debería ser realmente necesario.

Espero que esto ayude.

¿Por qué quieres crear nuevos ámbitos en python de todos modos?

La razón normal para hacerlo en otros idiomas es el scope variable, pero eso no sucede en Python.

 if True: a = 10 print a 

Me gustaría ver esto como una señal clara de que es hora de crear una nueva función y refactorizar el código. No veo ninguna razón para crear un nuevo scope como ese. ¿Alguna razón en mente?

Las variables en la lista de comprensión (Python 3+) y los generadores son locales:

 >>> i = 0 >>> [i+1 for i in range(10)] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> i 0 

Pero, ¿por qué exactamente necesitas esto?

Si solo desea crear variables temporales y dejar que se recojan de basura justo después de usarlas, puede usar

 del varname 

Cuando ya no los quieras.

Si es solo por la estética, puede usar comentarios o nuevas líneas adicionales, sin embargo, no se requiere sangría adicional.

Un ámbito es una región textual de un progtwig de Python donde un espacio de nombres es directamente accesible. “Directamente accesible” aquí significa que una referencia no calificada a un nombre intenta encontrar el nombre en el espacio de nombres …

Por favor, lea la documentación y aclare su pregunta.

por cierto, no es necesario if(TRUE){} en C, un simple {} es suficiente.

Python tiene exactamente dos ámbitos, local y global. Las variables que se utilizan en una función están en el ámbito local sin importar en qué nivel de sangrado se crearon. Llamar a una función anidada tendrá el efecto que estás buscando.

 def foo(): a = 1 def bar(): b = 2 print a, b #will print "1 2" bar() 

Aún como todos los demás, tengo que preguntarte por qué quieres crear un scope limitado dentro de una función.

 def a(): def b(): pass b() 

Si solo quiero una sangría adicional o estoy depurando, usaré if True:

actualizar

Esta respuesta es incorrecta. with statement no restringe el scope; solo le permite limpiar al salir del ámbito (aunque puede hacer que la excepción de lanzamiento de objeto se acceda después de salir).


Dependiendo de su caso, es posible que desee with statement :

 with Cat() as cat, Cake() as cake: cat.eat(cake) 

es equivalente a

 # scope begin cat = Cat() cake = Cake() cat.eat(cake) # scope end