views:

2306

answers:

9

I am a totally blind programmer who would like to learn Python. Unfortunately the fact that code blocks are represented with different levels of indentation is a major stumbling block. I was wondering if there were any tools available that would allow me to write code using braces or some other code block delimiter and then convert that format into a properly indented representation that the Python interpreter could use?

+9  A: 

I personally doubt that there currently is at the moment, as a lot of the Python afficionados love the fact that Python is this way, whitespace delimited.

I've never actually thought about that as an accessibility issue however. Maybe it's something to put forward as a bug report to Python?

I'd assume that you use a screen reader here however for the output? So the tabs would seem "invisible" to you? With a Braille output, it might be easier to read, but I can understand exactly how confusing this could be.

In fact, this is very interesting to me. I wish that I knew enough to be able to write an app that will do this for you.

I think it's definately something that I'll put in a bug report for, unless you've already done so yourself, or want to.

Edit: Also, as noted by John Millikin There is also PyBraces Which might be a viable solution to you, and may be possible to be hacked together dependant on your coding skills to be exactly what you need (and I hope that if that's the case, you release it out for others like yourself to use)

Edit 2: I've just reported this to the python bug tracker

Mez
+6  A: 

You should be able to configure your editor to speak the tabs and spaces -- I know it's possible to display whitespace in most editors, so there must be an accessibility option somewhere to speak them.

Failing that, there is pybraces, which was written as a practical joke but might actually be useful to you with a bit of work.

John Millikin
However, you've got to think of the fact that at a certain point, the remembering where you are in a code block dependant on tabs is going to be hard. Braces mark a specific start and end marker, whereas with tabs, it can be confusing (I get confused with it and I'm sighted!)
Mez
+1  A: 
andy
"level 4 indentation" foo equals new bar"level 3 indentation" It's confusing, and having to keep track of that in your mind is an extra burden.
Mez
Not "level N indentation", "in" vs. "out", or "indent" vs. "dedent" should be enough.def foo ( x ) : indent return x * 2 dedent
kaleissin
+6  A: 

Although I am not blind, I have heard good things about Emacspeak. They've had a Python mode since their 8.0 release in 1998 (they seem to be up to release 28.0!). Definitely worth checking out.

technomalogical
+21  A: 

Python supports braces for defining code blocks, and it also supports using 'begin' and 'end' tags.

Please see these code examples:

class MyClass(object): #{
    def myfunction(self, arg1, arg2): #{
        for i in range(arg1): #{ 
            print i
        #}
    #}
#}

And an example with bash style:

fi = endclass = enddef = endclass = done = None
class MyClass(object):
    def myfunction(self, arg1, arg2):
        for i in range(arg1): #do
            if i > 5: #then
                print i
            fi
        done
    enddef
endclass

The best thing about this is is that you can forget to put a close bracket in, and it's still valid python!

class MyClass(object): #{
    def myfunction(self, arg1, arg2): #{
        for i in range(arg1): #{ 
            print i
        # whoops, forgot to close that bracket!
    #}
#}

original gag: Here.

My real advice is to get a Braille display if you can afford one/source one - blind python programmers of my acquaintance really found a Braille display indispensable for writing python programs, it makes the indentation thing much less painful. A 40 cell display is well worth it.

Jerub
+29  A: 

There's a solution to your problem that is distributed with python itself. pindent.py, it's located in the Tools\Scripts directory in a windows install (my path to it is C:\Python25\Tools\Scripts), it looks like you'd have grab it from svn.python.org if you are running on Linux or OSX.

It adds comments when blocks are closed, or can properly indent code if comments are put in. Here's an example of the code outputted by pindent with the command:

pindent -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

Where the original myfile.py was:

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!'

You can also use pindent.py -d to insert the correct indentation based on comments (read the header of pindent.py for details), this should allow you to code in python without worrying about indentation.

I'd be interested to learn what solution you end up using, if you require any further assistance, please comment on this post and I'll try to help.

Ryan
+2  A: 

I use eclipse with the pydev extensions since it's an IDE I have a lot of experience with. I also appreciate the smart indentation it offers for coding if statements, loops, etc. I have configured the pindent.py script as an external tool that I can run on the currently focused python module which makes my life easier so I can see what is closed where with out having to constantly check indentation.

Jared
A: 

There are various answers explaining how to do this. But I would recommend not taking this route. While you could use a script to do the conversion, it would make it hard to work on a team project.

My recommendation would be to configure your screen reader to announce the tabs. This isn't as annoying as it sounds, since it would only say "indent 5" rather than "tab tab tab tab tab". Furthermore, the indentation would only be read whenever it changed, so you could go through an entire block of code without hearing the indentation level. In this way hearing the indentation is no more verbose than hearing the braces.

As I don't know which operating system or screen reader you use I unfortunately can't give the exact steps for achieving this.

Saqib
+1  A: 

Edsger Dijkstra used if ~ fi and do ~ od in his "Guarded Command Language", these appear to originate from the Algol68. There were also some example python guarded blocks used in 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)

Whitespace mangled python code can be unambiguously unmangled and reindented if one uses guarded blocks if/fi, do/od & try/yrt together with semicolons ";" to separate statements. Excellent for unambiguous magazine listings or cut/pasting from web pages.

It should be easy enough to write a short python program to insert/remove the guard blocks and semicolons.

NevilleDNZ