有没有一种方法可以将Python代码中的缩进转换为大括号?

时间:2020-03-06 14:34:34  来源:igfitidea点击:

我是一个完全盲的程序员,想学习Python。不幸的是,代码块以不同的缩进级别表示的事实是一个主要的绊脚石。我想知道是否有可用的工具允许我使用花括号或者其他代码块定界符编写代码,然后将该格式转换为Python解释程序可以使用的适当缩进表示形式?

解决方案

我个人怀疑当前是否存在这种情况,因为许多Python爱好者都喜欢Python这样用空格分隔的事实。

但是,我从未真正将其视为可访问性问题。也许是作为向Python提交的错误报告提出的东西?

我假设我们在这里使用屏幕阅读器作为输出?因此,选项卡对我们而言似乎"不可见"?使用盲文输出,可能会更容易阅读,但是我可以确切地理解这可能造成的混乱。

实际上,这对我来说很有趣。我希望我有足够的知识能够编写一个可以为我们完成此操作的应用程序。

我认为这绝对是我将要提交给错误报告的内容,除非我们自己或者愿意这样做。

编辑:另外,正如约翰·米利金(John Millikin)所指出的那样,还有PyBraces可能对我们来说是可行的解决方案,并且可能完全取决于编码技能而被黑客入侵,而这正是我们所需要的(我希望是这样,我们可以将其发布给其他人,例如我们自己使用)

编辑2:我刚刚将此报告给python bug跟踪器

我们应该能够配置编辑器以说出制表符和空格-我知道大多数编辑器中都可以显示空格,因此在某处必须有可访问性选项才能说出它们。

失败的是,有一些pybraces,这被写成是一个恶作剧,但实际上可能对我们有所帮助。

尽管我不是盲人,但我听说过有关Emacspeak的好消息。从1998年的8.0版本开始,他们就拥有了Python模式(它们似乎要到28.0版本为止!)。绝对值得一试。

Python支持用于定义代码块的花括号,并且还支持使用'begin'和'end'标签。

请参见以下代码示例:

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

还有一个bash样式的示例:

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

最好的是,我们可以忘记放在右括号中,并且它仍然是有效的python!

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

原始的插科打g

我的真正建议是,如果我们能负担得起一个/源的盲人显示器,那么我的一个熟人就真的发现盲文显示器对于编写python程序是必不可少的,这使得缩进的痛苦要小得多。 40格的显示器非常值得。

有一个针对问题的解决方案,该解决方案随python一起分发。 pindent.py,位于Windows安装目录下的Tools \ Scripts目录中(我的路径是C:\ Python25 \ Tools \ Scripts),如果我们想从svn.python.org上获取它,我们正在Linux或者OSX上运行。

当块关闭时,它会添加注释,或者如果添加了注释,则可以适当地缩进代码。这是pindent使用以下命令输出的代码的示例:

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

原始的" 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!'

我们还可以使用pindent.py -d根据注释插入正确的缩进(有关详细信息,请阅读pindent.py的标题),这应该使我们可以在python中进行编码而不必担心缩进。

我很想了解我们最终使用的解决方案,如果我们需要任何进一步的帮助,请对此帖子发表评论,我将尽力提供帮助。

我将eclipse与pydev扩展一起使用,因为它是我有很多经验的IDE。我也很欣赏它为if语句,循环等编码提供的智能缩进。我已经将pindent.py脚本配置为可以在当前关注的python模块上运行的外部工具,这使我的生活更加轻松,因此我可以看到什么在无需经常检查缩进的情况下关闭。

有各种答案说明如何执行此操作。但是我建议不要走这条路。尽管我们可以使用脚本进行转换,但是这将使团队项目工作变得困难。

我的建议是配置屏幕阅读器以宣布选项卡。这听起来并不那么令人讨厌,因为它只会说"缩进5"而不是"选项卡选项卡选项卡选项卡"。此外,缩进仅在更改时才读取,因此我们可以遍历整个代码块,而不必听见缩进级别。通过这种方式,听见压痕不会比听括号更冗长。

不幸的是,由于我不知道我们使用的是哪种操作系统或者屏幕阅读器,因此无法提供实现此目的的确切步骤。

Edsger Dijkstra在他的" Guarded Command Language"中使用了if和do,它们似乎起源于Algol68. RosettaCode.org中还使用了一些示例性的python保护块。

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)

如果使用以下代码,则可以清楚地将空白错乱的python代码取消修饰并重新缩进
受保护的块if / fi,do / od和try / yrt以及分号";"分开陈述。非常适合用于明确的杂志列表或者从网页剪切/粘贴。

编写一个简短的python程序以插入/删除防护块和分号应该足够容易。