有没有办法将Python代码中的缩进转换为大括号?

我是一个完全盲目的程序员谁想要学习Python。 不幸的是,代码块以不同级别的缩进表示的事实是一个主要的绊脚石。 我想知道是否有任何工具可以让我使用大括号或其他代码块分隔符编写代码,然后将该格式转换为Python解释器可以使用的正确缩进的表示forms?

有一个解决scheme,您的问题是与Python本身分发。 pindent.py ,它位于Windows安装的Tools \ Scripts目录下(我的path是C:\ Python25 \ Tools \ Scripts),看起来你可以从svn.python.org抓取它在Linux或OSX上运行。

它在块closures时添加注释,或者如果注释被放入,则可以正确缩进代码。下面是通过命令输出的代码示例:

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中编写代码而不用担心缩进。

我有兴趣了解你最终使用的解决scheme,如果你需要任何进一步的帮助,请评论这个职位,我会尽力帮助。

Python支持用于定义代码块的大括号,并且还支持使用“开始”和“结束”标记。

请看这些代码示例:

 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! #} #} 

原来的堵嘴

我真正的build议是,如果你能买得起一个盲文显示器,那么我的熟人盲人python程序员真的发现了一个盲文显示器,这对于编写python程序来说是必不可less的,它使得缩进的东西更加痛苦。 40单元显示器是非常值得的。

我个人怀疑目前是否有这样的情况,因为很多Python爱好者都喜欢Python是这样,空白分隔的。

然而,我从来没有真正考虑过这个问题。 也许这是提出作为一个错误报告给Python?

我假设你在这里使用屏幕阅读器的输出? 所以标签对你来说似乎是“隐形”的? 有了盲文输出,可能会更容易阅读,但我可以明白这是多么混乱。

其实这对我来说很有意思。 我希望我能够写出一个能为你做到这一点的应用程序。

我认为这是一个明确的东西,我会把一个错误报告,除非你已经这样做了,或者你想。

编辑:另外,正如John Millikin所指出的那样 , PyBraces也可能是一个可行的解决scheme,而且可能根据你的编码技巧被黑客攻击到你想要的地方(我希望如果是这样的话,你把它释放出来像别人一样使用)

编辑2:我刚刚向python bug跟踪器报告

虽然我不是盲目的,但我已经听到了关于Emacspeak的好消息。 自从1998年发布8.0版本以来,他们已经有了一个Python模式(他们似乎已经达到了28.0版本!)。 绝对值得一试。

你应该能够configuration你的编辑器说出标签和空格 – 我知道可以在大多数编辑器中显示空白,所以必须有一个可访问选项在某处说出来。

如果没有,就有pybraces ,这被写成一个实际的笑话,但可能实际上是有用的一点工作给你。

如果您使用的是Windows,我强烈build议您从以下url查看EdSharp: http ://empowermentzone.com/EdSharp.htm它支持所有领先的Windows屏幕阅读器,可以将其configuration为说缩进级别的代码,或者它有一个名为PyBrace的内置工具,如果你想这样做,它可以转换成大括号的语法,它支持程序员在我们的文本编辑器中所期望的各种其他function。 我已经使用了多年,从PHP到JavaScript到HTML到Python,我都喜欢它。

我很感谢你的问题,但认为你是指定的实现,而不是你需要解决的问题。 而不是转换为大括号,如何让你的屏幕阅读器告诉你缩进级别?

例如, 有些人使用vim语法着色来表示python缩进级别。 也许修改后的语法着色可能会产生你的屏幕阅读器会读取的内容

所有这些“不,你不能”types的答案真的很烦人。 当然可以。

这是一个黑客,但你可以做到。

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

在将其传递给解释器之前,使用自定义编码将花括号转换为缩进块。


另外,作为python的新手 – 我不接受甚至不允许使用大括号/通用块分隔符的背后原因…除了这是python开发人员的偏好。 大括号至less不会意外地被吃掉,如果你正在做一些代码的自动处理,或者在一个不理解空白是重要的编辑器中工作的话。 如果您自动生成代码,则不必跟踪缩进级别。 如果你想用python做一个perl-esque单线程,你会自动瘫痪。 如果没有别的,只是作为一种保障。 如果你的1000线python程序得到所有的选项卡吃了什么? 你要逐行去找出缩进的位置?

问一下这个问题总会得到一个像“__ future __ import braces”这样的“just do”,“正确configuration你的IDE”,“无论如何都会更好,以至于习以为常”。

我明白了他们的观点,但是,如果我想的话,我可以在每一行之后加上一个分号。 所以我不明白为什么大家对大括号这么坚决。 如果您需要使用您的语言来强制您正确缩进,那么您首先不会做正确的事情。

只是我的2C – 无论如何我会使用大括号。

我使用Eclipse的pydev扩展,因为它是一个IDE我有很多的经验。 我也很欣赏它为编码if语句,循环等提供的智能缩进。我已经将pindent.py脚本configuration为一个外部工具,可以在当前聚焦的python模块上运行,这使得我的生活更轻松,所以我可以看到什么是closures的地方不得不经常检查缩进。

search一个可访问的Python IDE,发现这一点,并决定回答。 在带有JAWS的Windows下:

  1. 通过在您喜欢的文本编辑器中按JawsKey + 6 (在字母上方的数字行)转到设置中心。 如果JAWS提示创build一个新的configuration文件,请同意。
  2. 在search字段中,input“indent”
  3. 只会有一个结果:“说缩进字符”。 打开这个。
  4. 请享用!

唯一让我们感到沮丧的是,我们无法在网站上欣赏代码示例(因为在浏览器中进行缩进并不太舒服 – 它会产生多余的言语)。

来自另一个Python初学者的快乐编码)。

有各种答案解释如何做到这一点。 但我会build议不要采取这个路线。 虽然您可以使用脚本来完成转换,但是却很难在团队项目上工作。

我的build议是configuration你的屏幕阅读器宣布选项卡。 这听起来并不像听起来那么讨厌,因为它只会说“缩进5”,而不是“标签选项卡选项卡选项卡选项卡”。 此外,缩进只会在每次更改时才读取,因此您可以在不听到缩进级别的情况下浏览整个代码块。 通过这种方式,听到缩进不会比听到括号更冗长。

由于我不知道你使用哪个操作系统或屏幕阅读器,所以我不幸的是无法给出实现这个步骤的确切步骤。

Edsger Dijkstra在他的“被守卫的命令语言”中使用了〜fi和do〜od ,这些似乎起源于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) 

如果/ fi,do / od&try / yrt和分号一起使用了保护块,那么空白的mangled python代码可以毫不含糊地重新排列。 分开陈述。 非常适合明确的杂志列表或从网页上剪切/粘贴。

编写一个简短的python程序来插入/删除guard block和分号应该很容易。