【问题标题】:Atom auto indentation script ruins Python indentationAtom 自动缩进脚本破坏了 Python 缩进
【发布时间】:2018-02-05 04:14:52
【问题描述】:

我在我的 Atom 配置的 init.coffee 文件中编写了这个函数来自动缩进整个文件:

atom.commands.add 'body', 'custom:auto-format', ->
    editor = atom.workspace.getActiveTextEditor();

    oldSelection = editor.getSelectedBufferRanges();

    editor.selectAll();
    editor.autoIndentSelectedRows();

    editor.setSelectedBufferRanges(oldSelection);

对于除 Python 之外的所有语言,它都能完美运行!我对结果非常满意。但是,CoffeeScript 自动缩进完全与 Phyton 代码混淆。

它需要这个文件:

import sys

def factorial (n):
    if n == 1:
        return 1
    else:
        return n * factorial(n-1)

if __name__ == "__main__":
    for arg in sys.argv[1:]:
        n = factorial(int(arg))
        print("The factorial of " + arg + " is " + str(n))

并且无法识别阶乘函数的结束位置,因此缩进如下:

import sys

def factorial (n):
    if n == 1:
        return 1
    else:
        return n * factorial(n-1)

        if __name__ == "__main__":
            for arg in sys.argv[1:]:
                n = factorial(int(arg))
                print("The factorial of " + arg + " is " + str(n))

如果有人对如何解决这个问题有任何见解,将不胜感激!

【问题讨论】:

  • 您不能自动缩进 Python 代码。两种缩进变体都是完全合法的 Python 代码;只有作为程序员的你知道为什么其中一个是错误的。
  • @MartijnPieters 后缩进 python 代码显然不是预期的结果。 main 不应与阶乘函数的 else 情况同样缩进。编辑:我看到我的逻辑错误。 main 仍然是一个 if 语句
  • 假设那一行不是“if __name__ ..”,而是“if foo:”?自动压头如何知道它应该去哪里?
  • @NedBatchelder 哦 - 我明白你们在说什么。我的错!是的,我想我还在考虑其他语言的主要方法。从技术上讲,它仍然是一个 if 语句
  • 我已回滚您的编辑;这个问题在更改之前实际上更有意义,我在回答中引用了__name__ 测试。

标签: python coffeescript indentation atom-editor


【解决方案1】:

您不能自动缩进 Python 代码,句号。

自动缩进仅适用于块由显式开始和结束标记(例如花括号)描述的语言。这种语言的缩进本质上是可选的,仅由人类软件开发人员用于帮助阅读。

但是在 Python 中,缩进是有意义的;代码的执行方式随着缩进的变化。让软件决定应用多少缩进就像让计算机读懂你的想法,然后再猜测程序员想要代码做什么。

例如,以下未缩进的代码可以以不同的方式缩进,并导致不同的结果。哪一种解释是正确的?

var = 'foobar'
for i in range(5):
if var.endswith('bar'):
print('Hello')
if i == 0:
print('World')
break
var += 'spam'
else:
print('!')

您将if __name__ == '__main__': 测试视为顶级语句并不重要。 Python 不知道这一点,这样的测试在 Python 代码中的任何地方都是合法的,有时甚至在函数或类定义中也有意义。

【讨论】:

  • 好的 - 我现在看到了我的方式的错误。谢谢你。 Alteast 的自动缩进几乎适用于所有其他语言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
相关资源
最近更新 更多