Python で 100 行のコードを書き、ループ ステートメントをどこかに追加するのを忘れたらどうしますか?
つまり、while ステートメントをどこかに追加すると、その下のすべての行をインデントする必要があります。中括弧を付けてそれで済むわけではありません。すべての行に移動し、タブ/スペースを追加します。ネストされた loop/if/then ステートメントを既存のコードに追加するとどうなるでしょうか?
ショートカットがありませんか?
Python で 100 行のコードを書き、ループ ステートメントをどこかに追加するのを忘れたらどうしますか?
つまり、while ステートメントをどこかに追加すると、その下のすべての行をインデントする必要があります。中括弧を付けてそれで済むわけではありません。すべての行に移動し、タブ/スペースを追加します。ネストされた loop/if/then ステートメントを既存のコードに追加するとどうなるでしょうか?
ショートカットがありませんか?
すべての本格的なエディターまたは IDE は、複数の行を選択してタブを押してインデントするか、Shift-Tab を押してそのすべての行をインデント解除するオプションをサポートしていると思います。
標準の Python IDE である IDLE でコードを選択し、「フォーマット」に進むと、インデント領域、デデント領域などを選択できます。
編集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
からそのハンドルが閉じられます。Python 2.6 では、イテレータから次の値を取得した後、( を実装する C コードで) ファイルがまだ開いているかどうか、およびファイル ハンドルがゼロでないかどうかを確認するチェックが行われないため、このセグメンテーション違反が発生します。2.7 未満では例外がスローされるだけなので、この戦略はそこで機能する可能性があります。next
file.writelines
writelines
上記のコードは、実際には正しくテストします。
再インデントするには、エディター コマンドを使用する必要があります。
心に留めておいてください:美しいことは醜いことよりも優れています.
...そして「The Zen of Python, by Tim Peters」の残りの部分
# python -c "import this"
一般的に、私が知る必要があるのはそれだけです。また、インデントが不十分なブロックの上または下にブレースを叩くのは簡単ですが、1日ほど見つめていないと、1週間後に混乱するだけです. 皆さん。