在 Python 中,如果你写了 100 行代码却忘记在某处添加一堆循环语句,你会怎么做?
我的意思是,如果你在某处添加一个 while 语句,你现在必须缩进它下面的所有行。这不像你可以只戴上牙套就可以了。转到每一行并添加制表符/空格。如果您在现有代码中添加嵌套循环/if/then 语句怎么办?
我错过了一些捷径吗?
在 Python 中,如果你写了 100 行代码却忘记在某处添加一堆循环语句,你会怎么做?
我的意思是,如果你在某处添加一个 while 语句,你现在必须缩进它下面的所有行。这不像你可以只戴上牙套就可以了。转到每一行并添加制表符/空格。如果您在现有代码中添加嵌套循环/if/then 语句怎么办?
我错过了一些捷径吗?
我认为每个严肃的编辑器或 IDE 都支持选择多行并按 Tab 缩进或 Shift-Tab 取消缩进所有行的选项。
在IDLE,标准python IDE中,选择代码,继续'格式',你可以选择缩进区域,缩进区域等
您必须使用编辑器命令重新缩进。
请记住:美丽胜于丑陋。
...以及“Python之禅”的其余部分,蒂姆·彼得斯(Tim Peters)
# python -c "import this"
编辑:重写以适应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 下它只是抛出一个异常,所以这个策略可能在那里有效。
上面的代码实际上确实测试正确。
这就是我需要知道的。是的,在缩进不佳的块上方或下方打支架很容易,但是您知道一周后当您一天没有盯着它看时,它只会使您感到困惑。伙计们。