📝

プロンプトみたいな改行付き文字列をインデント付きでエディタにいい感じに書きたい

2024/11/16に公開

はじめに

こんにちは!
プロンプトエンジニアリングしてますか?

ところで、次のような改行付きインデント付きの文字列を使いたいときってありますよね

制約:
    改行を入れること
    インデントを守ること

ただ、うっかりすると変な改行やインデントが入っていてテキストがめちゃくちゃになってたり、それを直すためにエディタの表示がぐちゃぐちゃになってたりしますよね・・

そこで、いい感じにエディタにかける記法を用法別にまとめてみました!

方法 メリット デメリット
トリプルクォート シンプル 改行やインデントが崩れやすい
dedent メソッドだけで便利 改行の除去が必要
join 改行が明示的で見やすい インデントの追加が必要
文字列結合 文字列が少ないときに便利 改行コードの追加が必要

トリプルクォート

text = """制約:
    改行を入れること
    インデントを守ること"""

'制約:\n 改行を入れること\n インデントを守ること'

最もシンプルな方法ですが、うっかりすると改行が入ります

text = """
制約:
    改行を入れること
    インデントを守ること
"""

'\n制約:\n 改行を入れること\n インデントを守ること\n'

また、もっとうっかりするとインデントも入ります

if True:
    text = """
        制約:
            改行を入れること
            インデントを守ること
    """

'\n 制約:\n 改行を入れること\n インデントを守ること\n '
不要な改行や空白がそのまま入ってしまいます

dedent

from textwrap import dedent

if True:
    row_text = """
        制約:
            改行を入れること
            インデントを守ること
    """

text = dedent(row_text)

'\n制約:\n 改行を入れること\n インデントを守ること\n'
インデントを揃えて左に詰めることができますが、改行は残ります

スライスを使って両端の改行(\n)を除去

text = dedent(row_text)[1:-1]

'制約:\n 改行を入れること\n インデントを守ること'

strip()を使って両端の空白文字(スペース、タブ、改行)を除去

text = dedent(row_text).strip()

'制約:\n 改行を入れること\n インデントを守ること'
しかし、strip()はスペースも除去してしまうので場合によっては意図しないインデントになることがあります

join

text = "\n".join(
    [
        "制約:",
        "    改行を入れること",
        "    インデントを守ること",
    ]
)

print(repr(text))

'制約:\n 改行を入れること\n インデントを守ること'
リストを使っているので、f文字列や変数を使うこともできます

一方で、毎回インデントを手作業で入れるのは大変です

indentをつかってインデントを追加

from textwrap import indent

constraint = "\n".join(
    [
        "改行を入れること",
        "インデントを守ること",
    ]
)

text = "\n".join(
    [
        "制約:",
        indent(constraint, '    '),
    ]
)

'制約:\n 改行を入れること\n インデントを守ること'
あらかじめ用意した文字列をくっつける使い方が便利です

文字列結合

text = (
    "制約:\n"
    "    改行を入れること\n"
    "    インデントを守ること"
)

'制約:\n 改行を入れること\n インデントを守ること'
文字列リテラルを並べると文字列結合されるのを利用して()と合わせて改行して書くことができます
ただし、改行コードを入れる必要があります

また、f文字列も含めることができます

title = "制約"
text = (
    f"{title}:\n"
    "    改行を入れること\n"
    "    インデントを守ること"
)

'制約:\n 改行を入れること\n インデントを守ること'

おわりに

いかがだったでしょうか?
みなさんの好きなプロンプトの書き方が見つかればいいねお願いします!

参考

https://qiita.com/ykhirao/items/c7cba73a3a563be5eac6
https://dev.classmethod.jp/articles/python-heredocment-needs-dedent/
https://note.nkmk.me/python-long-string/

Discussion