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


81

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


出于好奇,您正在使用什么操作系统?
瑞安

4
但是,为什么空格和换行符是一个问题。是否有可能使文本阅读器说出无法打印的字符?
e-satis

2
这似乎是一场灾难的秘方-我不知道有谁愿意在每一行之前听“ space space space space space space space def foo”。
javawizard

@javawizard,它可以通过声明“ def foo冒号,下一行,增加缩进,...”或“缩进0级,def foo冒号,下一行缩进1级,……”来工作
。–平滑开发人员

@smoothdeveloper绝对是,这是发布者的问题。
javawizard

Answers:


56

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

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

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

原件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 -r根据注释插入正确的缩进(有关详细信息,请阅读pindent.py的标题),这应该允许您在python中进行编码而不必担心缩进。

例如,运行pindent.py -r myfile.py会将以下代码myfile.py转换为与pindent.py -c上面的示例产生的代码相同的正确缩进(也带有注释)的代码:

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

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


Downvote:这可能有助于阅读代码,但对编写代码没有帮助。当涉及到盲人的可访问性时,Python及其类似的仅依靠空格来表示嵌套的语言就固有地被破坏了。执行与pindent左对齐代码相反的代码的工具(许多盲程序员首选的缩进方案)可能很有用。会更有用from __future__ import braces-但不能用作复活节彩蛋。
David Hammen,

1
@DavidHammen:有一种工具,执行的逆pindent.py -c; 是pindent.py -r。瑞安(Ryan)已经在回答中指出了这一点,但是我只是对其进行了编辑,以添加一个明确的示例,并且更容易遗漏。(此外,我更正了命令行选项,以实现此目的:它是-r,不-d只是删除注释。)
Ilmari Karonen

11

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

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

我假设您在这里使用屏幕阅读器作为输出?因此,选项卡在您看来似乎“看不见”?使用盲文输出,可能更易于阅读,但我可以确切地理解这会造成多大的混乱。

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

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

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

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


9

尽管我不是盲人,但我听说过有关Emacspeak的好消息。自1998年8.0发行以来,他们就拥有Python模式(它们似乎要发行28.0了!)。绝对值得一试。


6

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

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


2
但是,您必须考虑到这样一个事实,即在某个时刻,要记住依赖于制表符的代码块中的位置将非常困难。大括号标记一个特定的开始和结束标记,而使用制表符,可能会造成混淆(我对此感到困惑,并且被看见了!)
Mez

6

如果您使用的是Windows,强烈建议您访问以下网址查看EdSharp:http ://empowermentzone.com/EdSharp.htm 它支持所有领先的Windows屏幕阅读器,可以将其配置为讲代码的缩进级别,或者它具有一个称为PyBrace的内置实用程序,可以代替大括号语法进行转换,并且还支持程序员在我们的文本编辑器中期望的所有其他功能。我使用它已经有很多年了,从PHP到JavaScript到HTML到Python,我都喜欢它。


在过去的大约一年中,我一直将其用作主编辑。
贾里德(Jared)2012年

4

我感谢您的问题,但认为您是在指定实现而不是需要解决的问题。与其转换为花括号,不如通过一种方法让屏幕阅读器告诉您缩进级别?

例如,有些人致力于vim语法着色以表示python缩进级别。也许修改后的语法颜色可能会导致您的屏幕阅读器读取某些内容?


“第4级缩进” foo等于新的“第3级缩进”吧,这很令人困惑,必须牢记这一点是额外的负担。
Mez

1
仅“ N级缩进”,“入”对“出”或“缩进”对“凹进”就不够了。def foo(x):缩进返回x * 2 dedent
kaleissin

4

所有这些“不行”的答案确实很烦人。当然可以。

这是一个hack,但是您可以做到。

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

使用自定义编码将花括号转换为缩进的块,然后再将其传递给解释器。


顺便说一句,作为python的新手,我不接受甚至不允许使用花括号/通用块定界符的背后原因……除了那是python开发人员的偏好之外。如果您正在对代码进行一些自动处理或在不了解空格很重要的编辑器中工作,则括号至少不会被误吃。如果您是自动生成代码,则不必跟踪缩进级别。如果您想使用python进行perl风格的单线处理,则会自动瘫痪。如果没有别的,只是作为保障。如果您的1000行python程序将其所有选项卡都吃掉了怎么办?您将逐行查找缩进应该在哪里?

询问此问题总是会得到诸如“只要'从__将来的__导入括号''做','正确配置您的IDE”,“无论如何都更好,因此请习惯一下”这样的嘲讽式回答。

我明白他们的意思,但是,嘿,如果我愿意,我可以在每行之后加上一个分号。所以我不明白为什么每个人都对牙套如此坚持。如果您需要使用语言来迫使您正确缩进,那么您并不是一开始就这样做。

只是我的2c-无论如何,我都会用牙套。


您需要打开一个python shell并输入:import this
ThatAintWorking'July

1
的确,我的观点已被经验所左右。我试图找到一种方法来强制python符合我的一个项目的需求,但沮丧地发现它拒绝通过任何劝说来这样做。我从不同的角度来看待它,并且发现python是一个可以使用的漂亮且高度协作的平台。我学到的主要经验是廉价的黑客软件和计算机不能很好地融合在一起。我必须对解析算法进行一些深入的研究,但是我所获得的知识非常值得。我仍然不在乎缩进/缩进,但我尊重他们。
la11111

4

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

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

令我们沮丧的是,我们无法在网站上欣赏代码示例(因为缩进式浏览器说起来不太舒服-它会产生多余的语音)。

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


3

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


1

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

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

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


0

Edsger Dijkstra算法中使用,如果〜音响做〜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)

如果一个人使用受保护的块if / fi,do / od和try / yrt以及分号“;”一起使用,则空格混乱的python代码可以毫无歧义地重新插入并重新缩进。分开陈述。非常适合用于明确的杂志列表或从网页剪切/粘贴。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.