Q1string.Template("Hi $name").substitute(name="Bob")の結果はどれですか?
string と textwrap — 文字定数・テンプレートと整形
string.ascii_letters/digitsの文字定数とstring.Templateの $name置換、textwrap.dedentのインデント除去とfillの幅折り返しを、注文確認メールのテンプレで実行します。
string と textwrap の役割
stringとtextwrapは文字列処理を補うヘルパーです。stringは文字定数(英字・数字・記号の集まり)とTemplate($name形式のテンプレ置換)を提供し、textwrapは複数行文字列の整形(インデント除去・幅折り返し)を担当します。f-string やreplaceだけでは届かない場面で使い分けます。
string — 文字定数と Template によるテンプレート置換
string モジュールには 2 種類の機能があります。1 つ目は文字定数で、string.ascii_letters(英字 52 文字)/ string.digits(0〜9)/ string.punctuation(記号類)など、「英字とは」「数字とは」を自分で定義する手間を省くことができます。
2 つ目はstring.Templateで、$nameのような$ 記号付きの変数を文字列に埋め込んでおき、後からsubstitute(name="値")で置換できます。f"{name}"の f-string と似ていますが、Template はパーサーが単純で安全という特徴があり、ユーザー入力をテンプレ自体にする場面(メール本文テンプレなど)に向きます。
$name形式のプレースホルダー付き文字列をsubstituteで値に置き換える、軽量で安全なテンプレ機構。| 定数 / クラス | 中身 | 用途 |
|---|---|---|
| string.ascii_lowercase | abcdefghijklmnopqrstuvwxyz | 小文字英字 26 文字 |
| string.ascii_uppercase | ABCDEFGHIJKLMNOPQRSTUVWXYZ | 大文字英字 26 文字 |
| string.ascii_letters | 上記の連結(52 文字) | 英字判定・乱数文字列生成 |
| string.digits | 0123456789 | 数字判定 |
| string.punctuation | ! " # $ % & ' ... など | 記号判定 |
| string.Template(s) | $name 形式のテンプレートクラス | メール本文・通知テンプレなど |
textwrap — トリプルクォートのインデント除去と折り返し
textwrapは文字列の見た目を整える標準ライブラリです。よく使うのは 2 つで、textwrap.dedentはトリプルクォートで書いたテキストの先頭インデントを取り除く関数、textwrap.fillは長い文字列を指定幅で折り返す関数です。
コード中で"""..."""のように複数行の文字列を書くと、ソースのインデントがそのまま文字列に入ってしまいます。dedentは共通する先頭の空白だけを除去するので、コードのインデントは保ちつつ文字列は綺麗な状態に揃えられます。
| 関数 | 意味 | 戻り値 |
|---|---|---|
| textwrap.dedent(text) | 共通の先頭インデントを除去する | 整形後の文字列 |
| textwrap.fill(text, width=N) | 幅 N で折り返した 1 つの文字列に | 改行を含む 1 つの文字列 |
| textwrap.wrap(text, width=N) | 幅 N で分割した行のリスト | 文字列のリスト |
| textwrap.shorten(text, w) | 幅 N に収まらなければ末尾を [...] で省略 | 省略後の文字列 |
import textwrap
# dedent: トリプルクォートのインデントを除去
raw = """
こんにちは。
今日は良い天気ですね。
"""
print(textwrap.dedent(raw).strip())
# こんにちは。
# 今日は良い天気ですね。
# fill: 折り返し (英語の方が動きが分かりやすい)
long_text = "Python is a language that lets you work quickly and integrate systems."
print(textwrap.fill(long_text, width=30))
# Python is a language that
# lets you work quickly and
# integrate systems.
dedent と strip を組み合わせる
トリプルクォートの先頭は改行から始まることが多く、末尾も改行で閉じることが多いので、textwrap.dedent(raw).strip()の形でdedent + 前後の空白除去をワンライナーにするのが定石です。strip は組み込み文字列メソッドで、先頭と末尾の空白文字(改行を含む)を取り除きます。
理解度チェック
まずは1問ずつ答えてみましょう。
Q2トリプルクォートで書いた、ソースコードのインデント付きテキストから共通の先頭インデントを取り除くのに使うのはどれですか?
Q3textwrap.fill(text, width=20)の動きはどれですか?