如何修复Python缩进

我有一些Python代码有不一致的缩进。制表符和空格的大量混合使问题变得更糟,甚至空格缩进也没有保留。

代码按预期工作,但是很难维护。

如何在不破坏代码的情况下修复缩进(如HTML Tidy,但对于Python) ?

337474 次浏览

使用Vim,它不应该比点击Esc,然后输入…

:%s/\t/    /g

...在要更改的文件上。这将把所有制表符转换为四个空格。如果你的间隔不一致,那就更难了。

Emacs。它很好地支持Python所需的缩进。请检查这个链接http://python.about.com/b/2007/09/24/emacs-tips-for-python-programmers.htm

如果你正在使用Vim,请参阅:h retab

                                                        *:ret* *:retab*
:[range]ret[ab][!] [new_tabstop]
Replace all sequences of white-space containing a
<Tab> with new strings of white-space using the new
tabstop value given.  If you do not specify a new
tabstop size or it is zero, Vim uses the current value
of 'tabstop'.
The current value of 'tabstop' is always used to
compute the width of existing tabs.
With !, Vim also replaces strings of only normal
spaces with tabs where appropriate.
With 'expandtab' on, Vim replaces all tabs with the
appropriate number of spaces.
This command sets 'tabstop' to the new value given,
and if performed on the whole file, which is default,
should not make any visible change.
Careful: This command modifies any <Tab> characters
inside of strings in a C program.  Use "\t" to avoid
this (that's a good habit anyway).
":retab!" may also change a sequence of spaces by
<Tab> characters, which can mess up a printf().
{not in Vi}
Not available when |+ex_extra| feature was disabled at
compile time.

例如,如果你只是简单地打字

:ret

所有的标签都将展开为空格。

你可能想要

:se et  " shorthand for :set expandtab

确保任何新行都不会使用文字制表符。


如果你不使用Vim,

perl -i.bak -pe "s/\t/' 'x(8-pos()%8)/eg" file.py

将在file.py中用空格替换制表符,假设制表符每8个字符停止一次(为了以防万一,原始制表符将被替换为file.py.bak)。如果制表位每隔4个空格,则将8替换为4。

使用你在Python安装的Tools/scripts/目录中找到的reindent.py脚本:

修改Python (.py)文件使用 4空格缩进,没有硬制表符 字符。还要修剪多余的空间 还有行尾的制表符,还有 删除末尾的空行 文件。还要确保最后一行结束

请查看该脚本以获得详细的使用说明。


注意:如果你的linux发行版在Python中没有默认安装reindent:

许多linux发行版没有默认安装reindent,使用python——>获得reindent的一个简单方法是执行pip install reindent

pip的另一种选择是使用你的发行版包管理器(即apt-getyumdnf),但然后你需要弄清楚哪个包有命令行工具,因为每个发行版在不同的包中都有该工具。

还有PythonTidy(因为你说你喜欢HTML Tidy)。

它可以做的不仅仅是清理标签。如果你喜欢这种类型的东西,值得一看。

如果你很懒(像我一样),你也可以下载一个试用版的Wingware Python IDE,它有一个自动修复缩进的工具。它运行得很好。 http://www.wingware.com/ < / p >

对于这个问题,我有一个简单的解决办法。你可以先输入“:retab”,然后输入“:retab!”,然后一切都会好起来

尝试闲置,并使用Alt + X来查找缩进。

在大多数类unix系统上,您还可以运行:

expand -t4 oldfilename.py > newfilename.py

在命令行中,如果要用除4之外的多个空格替换制表符,则更改数字。您可以轻松地编写一个shell脚本来一次性处理一堆文件,并保留原始文件名。

我将使用autopep8来做到这一点:

$ # see what changes it would make
$ autopep8 path/to/file.py --select=E101,E121 --diff


$ # make these changes
$ autopep8 path/to/file.py --select=E101,E121 --in-place

注意:E101和E121是pep8缩进(我认为你可以简单地传递--select=E1来修复所有与缩进相关的问题-那些以E1开头的问题)。

你可以把这个应用到你的整个项目使用递归标志:

$ autopep8 package_dir --recursive --select=E101,E121 --in-place

参见工具将Python代码转换为符合PEP8的。

reindent脚本没有为我工作,由于一些缺失的模块。不管怎样,我发现这个sed命令非常适合我:

sed -r 's/^([  ]*)([^ ])/\1\1\2/' file.py

如果你想找一个工具将你的2-space indented python脚本转换为tab indented版本,只需使用这个在线工具:

https://www.tutorialspoint.com/online_python_formatter.htm

还有一个叫做YAPF的很棒的项目

它可以自动重新格式化整个项目或检查项目是否有正确的缩进/格式。我在一个商业项目中使用过,我推荐这样做。