【问题标题】:How to fix Python indentation如何修复 Python 缩进
【发布时间】:2010-11-04 16:43:46
【问题描述】:

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

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

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

【问题讨论】:

标签: python


【解决方案1】:

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

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

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


注意:如果您的 linux 发行版默认没有使用 Python 安装 reindent:

许多 Linux 发行版默认没有安装 reindentpython --> 获得 reindent 的一种简单方法是使用 pip install reindent

附言pip 的替代方法是使用你的发行版包管理器(即apt-getyumdnf),但是你需要弄清楚哪个包有命令行工具,因为每个发行版都有不同的工具包。

【讨论】:

  • 不幸的是,它不是 Debian 和 Ubuntu 上正常 Python 安装的一部分。它被分成python-examples 包。
  • 太棒了!所以 Debian 和 Ubuntu 用户需要做的就是 apt-get 那个包。或者,该脚本也在 svn.python.org/view/python/trunk/Tools/scripts/…
  • @Shay Erlichmen:试试“python -tt yourscript.py”
  • Fedora/RedHat/CentOS 用户应该安装“python-tools”包。
  • 只是添加到 ehemient 的评论中:一旦安装了 python-examples,你会在 /usr/share/doc/pythonX.X/examples/Tools/scripts/reindent.py 中找到 reindent。
【解决方案2】:

我会联系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 and E121 是 pep8 缩进(我认为您可以简单地通过 --select=E1 来解决所有与缩进相关的问题 - 以 E1 开头的问题)。

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

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

另见Tool to convert Python code to be PEP8 compliant

【讨论】:

  • 这太棒了...我一直在寻找像 ruby​​'s rubocop for python 这样的工具
  • 如果语法不正确,autopep8 会失败。你可以确认使用python -tt <file.py>
【解决方案3】:

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

 *:ret* *:retab*
:[范围]ret[ab][!] [new_tabstop]
                        替换所有包含 a 的空白序列
                         使用新的空白字符串
                        给定制表位值。如果不指定新的
                        tabstop 大小或为零,Vim 使用当前值
                        '制表位'。
                        'tabstop' 的当前值始终用于
                        计算现有选项卡的宽度。
                        使用 !,Vim 也只替换普通字符串
                        在适当的地方带有制表符的空格。
                        打开 'expandtab',Vim 用
                        适当数量的空格。
                        此命令将 'tabstop' 设置为给定的新值,
                        如果在整个文件上执行,这是默认的,
                        不应该做出任何明显的改变。
                        小心:此命令修改任何  字符
                        在 C 程序中的字符串内部。使用“\t”来避免
                        这(无论如何这是一个好习惯)。
                        ":retab!"也可以通过改变一系列空格
                         字符,这会弄乱 printf()。
                        {Vi 无此功能}
                        在 |+ex_extra| 时不可用功能在
                        编译时间。

例如,如果您只需键入

:ret

您的所有选项卡都将扩展为空格。

你可能想要

:se et " :set expandtab 的简写

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


如果你不使用 Vim,

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

将用空格替换制表符,假设制表符每 8 个字符停止一次,在 file.py 中(原版转到 file.py.bak,以防万一)。如果您的制表位是每 4 个空格,则将 8s 替换为 4s。

【讨论】:

  • 运行良好。这是修复标签缩进混淆的最简单方法。
  • 肯定不是最简单的方法。
【解决方案4】:

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 4 个空格(或任何 4 的倍数的缩进)是 PEP8 的一部分
【解决方案5】:

使用 Vim,不应该比按 Esc,然后键入...

:%s/\t/    /g

...在您要更改的文件上。这会将所有制表符转换为四个空格。如果你也有不一致的间距,那么这将更加困难。

【讨论】:

  • 您能找到原始编码员并应用增强的审讯技术吗?没有什么比不一致的缩进代码更糟糕的了。
  • @Ben 不一致的缩进是那个家伙给我们的问题中最少的:)
【解决方案6】:

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

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

【讨论】:

    【解决方案7】:

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

    expand -t4 oldfilename.py > newfilename.py
    

    如果您想用 4 以外的多个空格替换制表符,请从命令行更改数字。您可以轻松地编写一个 shell 脚本来一次处理一堆文件,同时保留原始文件名。

    【讨论】:

    • 请注意,使用相同的文件不起作用,并且会留下一个空文件,但这个答案确实有效,当我需要将制表符转换为空格时,我会使用它。任何人都可以解释否决票吗?我会为它 +1。
    • 有没有办法恢复被覆盖的文件?只需使用上述方法,我一天的代码价值就消失了facepalm。谢谢
    【解决方案8】:

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

    【讨论】:

      【解决方案9】:

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

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

      【讨论】:

      • 非法选项-r.
      【解决方案10】:

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

      【讨论】:

      • python 模式非常适合编写 Python,但链接中没有描述如何修复现有文件中的缩进。
      • M-x untabify 将在 emacs 中将制表符变成空格
      • 链接(实际上)已损坏。它重定向到标题为“C Programming Language for Beginners”(!)的页面。
      【解决方案11】:

      尝试IDLE,并使用Alt + X 查找缩进。

      【讨论】:

        【解决方案12】:

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

        【讨论】:

        • 在什么上下文中输入“:retab”。在Vim?
        【解决方案13】:

        如果想找到将您的2-space indented python 脚本制作成tab indented 版本的工具,只需使用此在线工具:

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

        【讨论】:

          【解决方案14】:

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

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

          【讨论】:

            猜你喜欢
            • 2022-06-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-04-07
            • 2023-03-29
            • 1970-01-01
            • 1970-01-01
            • 2022-11-21
            相关资源
            最近更新 更多