with 構文

with 構文

I/O では、stream を開いて、一連の処理をした後で、例外の有無にかかわらず stream を閉じるってプログラムの形は多くなります。 先ほども、socket を開いたり file を開いたりしてましたね。

def send_file(sock: socket, filename):
    # ファイルを開いて
    with open(filename, 'rb') as file_in:
        while True:
            # ファイルの中身を
            data = file_in.read(BUF_SIZE)
            if not data:  # ファイルを読み終わったら終了
                break
            # socket から送る
            sock.sendall(data)

単に最初に open 呼出しして、最後に close 呼出しするのと違い、 プログラムが途中で例外を起こすような場合でも、close を実行してくれます。

今回はあまり取り上げませんが、python でも例外の仕組みがあります。

file_in = open(filename, 'rb')
try:
    while True:
        data = file_in.read(BUFSIZE)
        if not data:
            break
        sock.sendall(data)
except Exception as excep:
    # handle が書きたい場合
finally:
    file_in.close()

のように記述可能です。