CUBE SUGAR CONTAINER

技術系のこと書きます。

Python: 複数行の文字列のインデントを揃えて読みやすくしたい

今回は小ネタ。 インデントのあるソースコード上で、複数行の文字列を読みやすくする方法について。 毎回どうやってたっけと調べるのでメモしておく。

使った環境は次のとおり。

$ sw_vers
ProductName:        macOS
ProductVersion:     15.2
BuildVersion:       24C101
$ python -V         
Python 3.11.9

もくじ

複数行の文字列のインデントを揃えたくなる場面について

インデントのある場所で複数行の文字列を扱おうとすると、以下のような感じになりがち。 ここでは関数 f() の中で "a""b""c" という文字を、それぞれ独立した行で、先頭にスペースを含めずに出力したい。 設定ファイルとかテンプレートなんかを扱うときのイメージ。

def f():
    s = """a
b
c"""
    print(s)

上記はもちろん上手くいく。 ただ、ソースコード上のインデントと文字列がズレているのでちょっと読みにくく感じる。

>>> f()
a
b
c

理想としては、たとえば以下のような感じにしたい。

def f():
    s = """
    a
    b
    c
    """
    print(s)

ただ、これだと 2 つ課題がある。 まず 1 つ目が、各行の先頭にインデントに相当するスペースが入ってしまうこと。 そして 2 つ目が、先頭と末尾に空行が入ってしまうこと。

>>> f()

    a
    b
    c
    

これだと設定ファイルやテンプレートとして利用できないことが考えられる。

各行の先頭のインデントを取り除く

まず、各行の先頭にインデントに相当するスペースが入ってしまう点は textwrap モジュールに dedent() という便利な関数がある。 この関数を使うと各行に入った先頭のインデントを除去してくれる。

import textwrap

def f():
    s = """
    a
    b
    c
    """
    print(textwrap.dedent(s))

使ってみると、次のように先頭のインデントに相当するスペースが取り除かれた。

>>> f()

a
b
c

先頭と末尾の空行を取り除く

次に、先頭と末尾の空行に関しては str#strip() メソッドを使うことで取り除ける。

import textwrap

def f():
    s = """
    a
    b
    c
    """
    print(textwrap.dedent(s).strip())

やってみると、次のように先頭と末尾の空行が取り除かれた。

>>> f()
a
b
c

いじょう。