如何修复Python缩进

Sha*_*men 253 python

我有一些Python代码具有不一致的缩进.有很多标签和空格的混合使事情变得更糟,甚至空间压痕也不会被保留.

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

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

Ale*_*lli 275

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

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

有关详细的使用说明,请查看该脚本.

  • 不幸的是,它不是Debian和Ubuntu上普通Python安装的一部分; 它被分成了`python-examples`包. (49认同)
  • 只是为了添加ephemient的评论:一旦安装了`python-examples`,你就会在`/ usr/share/doc/pythonX.X/examples/Tools/scripts/reindent.py`中找到. (26认同)
  • 优秀!所以Debian和Ubuntu用户需要做的就是apt-get那个包.或者,该脚本也位于http://svn.python.org/view/python/trunk/Tools/scripts/reindent.py?revision=66903&view=markup. (16认同)
  • @Shay Erlichmen:试试"python -tt yourscript.py" (9认同)
  • Fedora/RedHat/CentOS用户应该安装"python-tools"包. (8认同)
  • 在@LarryHastings之后,目前在安装`python-examples`之后,脚本位于`/ usr/share/doc/libpythonX.Y/examples/Tools/scripts/reindent.py`(请注意`pythonX.Y`成为` libpythonX.Y`). (3认同)
  • 但如果我想要标签怎么办?(为什么?因为它是The Right Way™).严肃地说:如果这个脚本甚至不够灵活,那么这个脚本就不好了. (2认同)
  • 在使用brew的Mac上,我使用了`find/usr | grep reindent`并找到`/usr/local/Cellar/python3/3.5.0/Frameworks/Python.framework/Versions/3.5/share/doc/python3.5/examples/Tools/scripts/reindent.py elevator_test.py` (2认同)

eph*_*ent 55

如果你正在使用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

将替换制表符与空格,假设制表符每8个字符停止file.py(原始的file.py.bak,以防万一).如果您的制表符每4个空格,则将4s替换为4s.

  • 工作得很好。这是修复制表符缩进混淆的最简单方法。 (2认同)

And*_*den 48

我会达到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
Run Code Online (Sandbox Code Playgroud)

注意:E101和E121是pep8缩进(我认为你可以简单地通过--select=E1修复所有与缩进相关的问题 - 从E1开始).

您可以使用递归标志将其应用于整个项目:

$ autopep8 package_dir --recursive --select=E101,E121 --in-place
Run Code Online (Sandbox Code Playgroud)

另请参见将Python代码转换为符合PEP8的工具.


Ped*_*ito 35

使用autopep8

autopep8 -i script.py 自动格式化Python代码以符合autopep8 PEP 8指南.它使用pep8实用程序来确定 nullstyle需要格式化的部分.nullcode能够解决大部分autopep8可以报​​告的 问题nullformatting.

pip install autopep8
autopep8 script.py    # print only
autopep8 -i script.py # write file
Run Code Online (Sandbox Code Playgroud)

  • @pkm 4个空格(或任何4的倍数的缩进)是PEP8的一部分 (2认同)

Ben*_*hes 11

使用Vim,它不应该比打击更多Esc,然后键入...

:%s/\t/    /g
Run Code Online (Sandbox Code Playgroud)

...在您要更改的文件上.这会将所有标签转换为四个空格.如果你的间距也不一致,那就更难了.

  • 你能找到原始编码器并应用增强的审讯技巧吗?没有什么比不一致的缩进代码更糟糕了. (11认同)
  • @Ben不一致的缩进是我们这个家伙最少的问题:) (3认同)

Pau*_*ndt 8

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

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


Mar*_*ter 6

由于缺少一些模块,重新缩进脚本对我不起作用。无论如何,我发现这个sed命令非常适合我:

sed -r 's/^([  ]*)([^ ])/\1\1\2/' file.py
Run Code Online (Sandbox Code Playgroud)

  • 非法选项 -r。 (3认同)

Yan*_*sky 5

如果你是懒惰的(像我一样),你也可以下载一个试用版的Wingware Python IDE,它有一个自动修复工具,用于搞乱缩进.它工作得很好. http://www.wingware.com/


Cro*_*man 5

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

expand -t4 oldfilename.py > newfilename.py
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,使用相同的文件不起作用,并且会留下一个空文件,但这个答案实际上有效,当我需要将制表符转换为空格时我会使用它。有人能解释一下否决票吗?我会把它+1。 (2认同)

归档时间:

查看次数:

237978 次

最近记录:

6 年,3 月 前