将循环语句添加到现有代码时的Python缩进

时间:2010-10-16 09:07:36

标签: python indentation python-idle

在Python中,当你编写100行代码并忘记在某处添加一堆循环语句时,你会怎么做?

我的意思是,如果你在某处添加一个while语句,你现在要缩进它下面的所有行。这并不是说你可以把牙箍放在一起并完成它。转到每一行并添加制表符/空格。如果要将嵌套循环/ if / then语句添加到现有代码中该怎么办?

我错过了一些捷径吗?

5 个答案:

答案 0 :(得分:11)

我认为每个认真的编辑器或IDE都支持选择多行的选项,并按Tab键缩进或Shift-Tab取消所有行。

答案 1 :(得分:3)

在IDLE,标准的python IDE中,选择代码,继续“格式化”,你可以选择缩进区域,dedent区域等等。

答案 2 :(得分:1)

您必须使用编辑器命令重新缩进。

请记住:美丽胜过丑陋。

......以及“蒂姆·彼得斯的禅宗之谜”

# python -c "import this"

答案 3 :(得分:1)

编辑:重写以适应fileinput的“怪癖”*

def indent_code(filename, startline, endline):
    from fileinput import input
    from itertools import izip, count

    all_remaining = count()
    def print_lines(lines, prefix='', range=all_remaining):
        for _, line in izip(range, lines):
            print prefix + line,

    lines = input(filename, inplace=1)
    print_lines(lines, range=xrange(1, startline))  # 1-based line numbers
    print_lines(lines, '    ', xrange(startline, endline + 1)) # inclusive
    print_lines(lines)

def main():
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('filename')
    parser.add_argument('startline', type=int)
    parser.add_argument('endline', type=int)
    ns = parser.parse_args()
    indent_code(ns.filename, ns.startline, ns.endline)

if __name__ == '__main__':
    main()

好吧,或者>}

*:我最初使用stdout.writelines和一些生成器表达式的简洁组合来编写它。不幸的是,该代码不起作用。 fileinput.input()返回的迭代器在调用其next方法之前实际上不会打开文件。它同时在sys.stdout上运行其粗略的输出重定向魔术。这意味着如果您调用sys.stdout.writelines并将fileinput.input迭代器,您的调用和输出传递给原始标准输出而不是fileinput重新映射到文件“目前正在处理中。所以你最终得到了应该替换文件内容的行,而不是只打印到终端。

可以通过在调用next之前调用fileinput迭代器上的stdout.writelines来解决此问题,但这会导致其他问题:到达输入文件的末尾会导致其句柄被关闭在next内调用时,迭代器的file.writelines方法。在Python 2.6下,这个段错误是因为在从迭代器获取下一个值之后,没有检查(在C代码中实现writelines)以查看文件是否仍然打开,并且文件句柄非零。我认为在2.7之下只会引发异常,所以这个策略可能会在那里发挥作用。

上面的代码确实可以正确测试。

答案 4 :(得分:0)

  • textmate(也许是e?):然后选择apple - ]
  • 的BBEdit: 也选择然后苹果 - ]
  • emacs的: 然后选择M-x'indent-region'
  • bpython:不知道,autoindenting是 在bpython中很容易,你必须这样做 努力打破它
  • xcode:不要在xcode中执行python

这通常都是我需要知道的。也许是的,在一个凹凸不平的块上方或下方拍一个支撑很容易,但是你知道它只会在一周之后将你的狗屎混淆,因为你没有一天盯着它。太大家了。