¿Hay alguna forma de convertir la sangría en el código Python en llaves?


81

Soy un programador totalmente ciego al que le gustaría aprender Python. Desafortunadamente, el hecho de que los bloques de código estén representados con diferentes niveles de sangría es un gran obstáculo. Me preguntaba si había alguna herramienta disponible que me permitiera escribir código usando llaves o algún otro delimitador de bloque de código y luego convertir ese formato en una representación con sangría adecuada que el intérprete de Python podría usar.


Por curiosidad, ¿qué sistema operativo estás usando?
Ryan

4
Pero, ¿por qué los espacios y los saltos de línea son un problema? ¿No es posible hacer que el lector de texto diga caracteres no imprimibles?
e-satis

2
Eso parece una receta para el desastre. No conozco a muchas personas a las que les gustaría escuchar "espacio espacio espacio espacio espacio espacio espacio espacio def foo" antes de cada línea.
javawizard

@javawizard podría funcionar indicando "def foo dos puntos, siguiente línea, aumento de sangría, ..." o "nivel de sangría 0, def foo dos puntos, siguiente línea sangría nivel 1, ..."
smoothdeveloper

@smoothdeveloper Absolutamente, y eso es lo que hace la pregunta del cartel.
javawizard

Respuestas:


56

Hay una solución a su problema que se distribuye con Python. pindent.py, se encuentra en el directorio Tools \ Scripts en una instalación de Windows (mi ruta es C: \ Python25 \ Tools \ Scripts), parece que tendrías que obtenerlo de svn.python.org si estás ejecutando en Linux u OSX.

Agrega comentarios cuando los bloques están cerrados, o puede sangrar correctamente el código si se colocan comentarios. Aquí hay un ejemplo del código generado por pindent con el comando:

pindent.py -c myfile.py

def foobar(a, b):
   if a == b:
       a = a+1
   elif a < b:
       b = b-1
       if b > a: a = a-1
       # end if
   else:
       print 'oops!'
   # end if
# end def foobar

Dónde estaba el original myfile.py:

def foobar(a, b):
   if a == b:
       a = a+1
   elif a < b:
       b = b-1
       if b > a: a = a-1
   else:
       print 'oops!'

También puede usar pindent.py -rpara insertar la sangría correcta según los comentarios (lea el encabezado de pindent.py para obtener más detalles), esto debería permitirle codificar en Python sin preocuparse por la sangría.

Por ejemplo, la ejecución pindent.py -r myfile.pyconvertirá el siguiente código en myfile.pyel mismo código correctamente sangrado (y también comentado) que se produjo en el pindent.py -cejemplo anterior:

def foobar(a, b):
if a == b:
a = a+1
elif a < b:
b = b-1
if b > a: a = a-1
# end if
else:
print 'oops!'
# end if
# end def foobar

Me interesaría saber qué solución termina utilizando, si necesita más ayuda, comente esta publicación e intentaré ayudarlo.


Votar en contra: Esto puede ayudar a leer el código, pero no ayuda a escribirlo. Python y lenguajes como este que dependen únicamente del espaciado para representar el anidamiento están intrínsecamente rotos cuando se trata de accesibilidad para ciegos. Podría ser útil una herramienta que realice lo inverso pindental código alineado a la izquierda (el esquema de sangría preferido de muchos programadores ciegos) . Sería más útil , pero no como un huevo de Pascua. from __future__ import braces
David Hammen

1
@DavidHammen: No es una herramienta que realiza la inversa de pindent.py -c; es pindent.py -r. Ryan ya señaló eso en su respuesta, pero solo lo edité para agregar un ejemplo explícito y hacer que sea más difícil pasarlo por alto. (Además, corrigí la opción de la línea de comandos para hacer eso: no es -rlo -dque simplemente elimina los comentarios).
Ilmari Karonen

11

Personalmente, dudo que exista en este momento, ya que a muchos de los aficionados a Python les encanta el hecho de que Python sea de esta manera, delimitado por espacios en blanco.

Sin embargo, nunca pensé en eso como un problema de accesibilidad. ¿Quizás sea algo para presentar como un informe de error a Python?

¿Asumiría que usa un lector de pantalla aquí sin embargo para la salida? ¿Entonces las pestañas le parecerían "invisibles"? Con una salida en Braille, podría ser más fácil de leer, pero puedo entender exactamente lo confuso que podría ser.

De hecho, esto me resulta muy interesante. Ojalá supiera lo suficiente para poder escribir una aplicación que lo haga por usted.

Creo que definitivamente es algo para lo que incluiré un informe de error, a menos que ya lo haya hecho usted mismo o quiera.

Editar: También, como se ha señalado por John Millikin También es PyBraces que podría ser una solución viable para usted, y puede ser posible ser pirateadas dependiente juntos en sus habilidades de codificación a ser exactamente lo que necesita (y espero que si ese es el caso , lo liberas para que otros como tú lo usen)

Edición 2: acabo de informar esto al rastreador de errores de Python


9

Aunque no soy ciego, he escuchado cosas buenas sobre Emacspeak . Han tenido un modo Python desde su versión 8.0 en 1998 (¡parecen estar listos para la versión 28.0!). Definitivamente vale la pena echarle un vistazo.


6

Debería poder configurar su editor para que diga las pestañas y los espacios; sé que es posible mostrar espacios en blanco en la mayoría de los editores, por lo que debe haber una opción de accesibilidad en algún lugar para decirlos.

En su defecto, hay pibraces , que se escribió como una broma, pero en realidad podría ser útil para usted con un poco de trabajo.


2
Sin embargo, debe pensar en el hecho de que, en cierto punto, recordar dónde se encuentra en un bloque de código que depende de las pestañas será difícil. Los apoyos marcan un marcador de inicio y fin específico, mientras que con pestañas, puede ser confuso (me confundo con él y estoy avisté!)
Mez

6

Si está en Windows, le recomiendo encarecidamente que eche un vistazo a EdSharp en: http://empowermentzone.com/EdSharp.htm Es compatible con todos los lectores de pantalla líderes de Windows, se puede configurar para hablar los niveles de sangría del código, o tiene una utilidad incorporada llamada PyBrace que puede convertir hacia y desde la sintaxis de llaves si desea hacerlo en su lugar, y es compatible con todo tipo de otras características que los programadores esperan de nuestros editores de texto. Lo he estado usando durante años, para todo, desde PHP hasta JavaScript, HTML y Python, y me encanta.


Lo he estado usando como mi editor principal durante el último año.
Jared

4

Aprecio su problema, pero creo que está especificando la implementación en lugar del problema que necesita resolver. En lugar de convertirlo en llaves, ¿qué tal si trabaja en una forma para que su lector de pantalla le indique el nivel de sangría?

Por ejemplo, algunas personas han trabajado en la coloración de la sintaxis de vim para representar los niveles de sangría de Python. ¿Quizás un color de sintaxis modificado podría producir algo que su lector de pantalla leería?


"sangría de nivel 4" foo es igual a una nueva barra "sangría de nivel 3" Es confuso, y tener que llevar un registro de eso en tu mente es una carga adicional.
Mez

1
No "sangría de nivel N", "dentro" frente a "salida", o "sangría" frente a "dentado" deberían ser suficientes. def foo (x): sangría return x * 2 dedent
kaleissin

4

Todos estos tipos de respuestas de "no, no puedes" son realmente molestos. Por supuesto que puede.

Es un truco, pero puedes hacerlo.

http://timhatch.com/projects/pybraces/

utiliza una codificación personalizada para convertir llaves en bloques con sangría antes de entregárselo al intérprete.


Como acotación al margen, y como alguien nuevo en Python, no acepto el razonamiento detrás de ni siquiera permitir llaves / delimitadores de bloques genéricos ... aparte de que es la preferencia de los desarrolladores de Python. Las llaves al menos no se comerán accidentalmente si estás procesando automáticamente tu código o trabajando en un editor que no entiende que los espacios en blanco son importantes. Si está generando código automáticamente, es útil no tener que realizar un seguimiento de los niveles de sangría. Si quieres usar Python para hacer un one-liner al estilo perl, automáticamente estás lisiado. Si nada más, solo como salvaguardia. ¿Qué pasa si su programa de Python de 1000 líneas obtiene todas sus pestañas comidas? ¿Vas a ir línea por línea y averiguar dónde debería estar la sangría?

Preguntar al respecto obtendrá invariablemente una respuesta irónica como "solo hazlo 'de __ futuro __ importar llaves'", "configura tu IDE correctamente", "es mejor de todos modos, así que acostúmbrate" ...

Entiendo su punto, pero bueno, si quisiera, podría poner un punto y coma después de cada línea. Así que no entiendo por qué todos son tan inflexibles sobre el tema de los frenillos. Si necesita que su lenguaje le obligue a sangrar correctamente, no lo está haciendo bien en primer lugar.

Solo mi 2c, de todos modos voy a usar aparatos ortopédicos.


necesita abrir un shell de Python e ingresar: importar esto
ThatAintWorking

1
De hecho, mi opinión se ha visto influida por la experiencia. Estaba tratando de encontrar una manera de obligar a Python a ajustarse a las necesidades de uno de mis proyectos y me frustraba descubrir que se negaba a hacerlo por cualquier medio de persuasión. Lo he abordado desde un ángulo diferente y he descubierto que python es una plataforma hermosa y altamente cooperativa para trabajar. La lección principal que aprendí es que los hacks baratos y las computadoras no se mezclan bien. Tuve que hacer un estudio en profundidad de los algoritmos de análisis, pero el conocimiento que he adquirido merece la pena. Todavía no me importa el sangrado / dentado, pero los respeto.
la11111

4

Buscando un IDE de Python accesible, encontré esto y decidí responder. En Windows con JAWS:

  1. Vaya al Centro de configuración presionando JawsKey+ 6(en la fila de números arriba de las letras) en su editor de texto favorito. Si JAWS le solicita que cree un nuevo archivo de configuración, acepte.
  2. En el campo de búsqueda, escriba "sangría"
  3. Solo habrá un resultado: "Diga los caracteres de sangría". Enciende esto.
  4. ¡Disfrutar!

Lo único que nos resulta frustrante es que no podemos disfrutar de ejemplos de código en sitios web (dado que hablar con sangría en los navegadores no es demasiado cómodo, genera un habla superflua).

Feliz codificación de otro principiante de Python).


3

Utilizo eclipse con las extensiones pydev ya que es un IDE con el que tengo mucha experiencia. También aprecio la sangría inteligente que ofrece para codificar declaraciones if, bucles, etc.He configurado el script pindent.py como una herramienta externa que puedo ejecutar en el módulo de Python actualmente enfocado, lo que hace mi vida más fácil para poder ver qué es cerrado donde sin tener que comprobar constantemente la sangría.


1

Hay varias respuestas que explican cómo hacer esto. Pero recomendaría no tomar esta ruta. Si bien podría usar un script para hacer la conversión, sería difícil trabajar en un proyecto de equipo.

Mi recomendación sería configurar su lector de pantalla para anunciar las pestañas. Esto no es tan molesto como parece, ya que solo diría "sangría 5" en lugar de "pestaña pestaña pestaña pestaña pestaña". Además, la sangría solo se leería siempre que cambiara, por lo que podría pasar por un bloque completo de código sin escuchar el nivel de sangría. De esta manera, escuchar la muesca no es más detallado que escuchar las llaves.

Como no sé qué sistema operativo o lector de pantalla usa, desafortunadamente no puedo dar los pasos exactos para lograrlo.


0

Edsger Dijkstra usó if ~ fi y do ~ od en su "Lenguaje de comando guardado ", estos parecen tener su origen en Algol68 . También hubo algunos ejemplos de bloques protegidos por Python utilizados en RosettaCode.org .

fi = od = yrt = end = lambda object: None;
class MyClass(object):
    def myfunction(self, arg1, arg2):
        for i in range(arg1) :# do
            if i > 5 :# then
                print i
            fi
        od # or end(i) #
    end(myfunction)
end(MyClass)

El código de Python destrozado por espacios en blanco se puede deshacer y renovar sin ambigüedades si se utilizan bloques protegidos if / fi, do / od & try / yrt junto con punto y coma ";" para separar declaraciones. Excelente para listas de revistas inequívocas o para cortar / pegar desde páginas web.

Debería ser bastante fácil escribir un programa Python corto para insertar / eliminar los bloques de protección y los puntos y comas.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.