如何修复Python缩进


264

我有一些缩进不一致的Python代码。制表符和空格的混合使用使情况变得更糟,甚至不保留空格缩进。

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

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


您可以查看这个链接,并提供您的投入如何使用reindent.py module-- stackoverflow.com/questions/12132481/installing-reindent-python/...
user1050619

-截至此相关的问题提到低于@安迪-海登的外观基本autopep8:提供缩进以及更多stackoverflow.com/questions/14328406/...
Pierz

2
这是一个非常有用的问题,我发现自己经常需要这样做。它不是关于“推荐工具”,而是关于“如何做”。
安迪·海登

Answers:


282

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

更改Python(.py)文件以使用4个空格的缩进,并且不使用硬制表符。还修剪行尾多余的空格和制表符,并删除文件末尾的空行。还要确保最后一行以换行符结尾。

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


51
不幸的是,它不是Debian和Ubuntu上普通Python安装的一部分;它分为python-examples包装。
ephemient

16
优秀的!因此,Debian和Ubuntu用户需要做的就是apt-get该软件包。另外,该脚本也位于svn.python.org/view/python/trunk/Tools/scripts/…
Alex Martelli,2009年

9
@Shay Erlichmen:尝试“ python -tt yourscript.py”
nosklo,2009年

8
Fedora / RedHat / CentOS用户应安装“ python-tools”软件包。
Cristian Ciupitu 09年

26
只是为了补充ephemient的注释:python-examples安装后,您会在中找到reindent /usr/share/doc/pythonX.X/examples/Tools/scripts/reindent.py
拉里·黑斯廷斯

59

如果您使用的是Vim,请参见:h retab

                                                        *:ret * *:retab *
:[range] ret [ab] [!] [new_tabstop]
                        替换所有包含空格的空白序列
                        <Tab>,使用新的空白字符串
                        给出制表符的值。如果不指定新的
                        制表符大小或为零,Vim使用当前值
                        “ tabstop”。
                        'tabstop'的当前值始终用于
                        计算现有标签的宽度。
                        使用!,Vim还将替换仅普通字符串
                        带有制表符的空格。
                        启用“ expandtab”后,Vim将所有选项卡替换为
                        适当数量的空格。
                        此命令将'tabstop'设置为给定的新值,
                        如果对整个文件执行默认设置,
                        不应进行任何可见的更改。
                        注意:此命令修改任何<Tab>字符
                        在C程序中的字符串中。使用“ \ t”避免
                        这(无论如何都是好习惯)。
                        “:重新标记!” 可能还会更改空格序列
                        <Tab>字符,可能会使printf()混乱。
                        {Vi无此功能}
                        | + ex_extra |时不可用 该功能已于禁用
                        编译时间。

例如,如果您只是键入

:ret

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

您可能要

:se等::set expandtab的简写

确保任何新行都不会使用文字标签。


如果您不使用Vim,

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

假设制表符每隔8个字符停止,则将用空格替换制表符file.pyfile.py.bak以防万一)。如果制表符停靠符是每4个空格,则用4s替换8s。


2
运作良好。这是修复选项卡缩进混淆的最简单方法。
Srikant 2014年

当然不是最简单的方法。
CONvid19年

52

我会为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的工具


这太棒了...我一直在寻找ruby的rubycop for python工具
OkezieE

1
autopep8如果语法不正确,则失败。您可以确认使用python -tt <file.py>
Nishant

47

autopep8 -i script.py

使用autopep8

autopep8 自动格式化Python代码以符合PEP 8 nullstyle指南。它使用该pep8实用程序来确定nullcode需要格式化的哪些部分 。autopep8能够nullformatting解决可以报告的大多数 问题pep8

pip install autopep8
autopep8 script.py    # print only
autopep8 -i script.py # write file

我只有一个行代码,前面带有“ import os”和4个空格,但是它没有缩进一个..任何原因
pkm 2015年

3
@pkm 4个空格(或任何4的缩进)是PEP8的一部分
rbaleksandar

13

使用Vim,除了点击Esc,然后输入...外,不应该涉及更多内容。

:%s/\t/    /g

...在您要更改的文件上。这会将所有选项卡转换为四个空格。如果间距也不一致,则将更加困难。


11
您可以追踪原始编码器并应用增强的询问技术吗?没有比缩进不一致的代码更糟糕的了。
本·休斯

3
@Ben缩进不一致是我们遇到的那个问题中最少的问题:)
Shay Erlichmen


5

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

expand -t4 oldfilename.py > newfilename.py

在命令行中,如果要用多个空格(而不是4)替换制表符,请更改数字。您可以轻松编写一个Shell脚本来同时处理一堆文件,并保留原始文件名。


1
请注意,使用相同的文件将不起作用,并且会留下一个空文件,但是此答案实际上有效,当我需要将制表符转换为空格时可以使用它。谁能解释一下反对票?我将其+1。
S. Kerdel

有什么办法可以恢复覆盖的文件?只需使用上述方法,我一天的代码就消失了facepalm。谢谢
Simas


4

由于缺少某些模块,reindent脚本对我不起作用。无论如何,我发现此sed命令对我来说很完美:

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

2
非法选项-r。
HelloWorld

2

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


2
python-mode非常适合编写Python,但该链接上没有任何内容描述如何在现有文件中修复缩进。
短暂

5
Mx untabify会将制表符转变为emacs中的空间
Paul Hildebrandt 2010年

链接已断开(有效)。它将重定向到标题为“初学者的C编程语言”(!)的页面。
彼得·莫滕森


0

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


1
:retab在什么情况下输入“ ”。在Vim中
彼得·莫滕森

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.