プロンプトみたいな改行付き文字列をインデント付きでエディタにいい感じに書きたい
はじめに
こんにちは!
プロンプトエンジニアリングしてますか?
ところで、次のような改行付きインデント付きの文字列を使いたいときってありますよね
制約:
改行を入れること
インデントを守ること
ただ、うっかりすると変な改行やインデントが入っていてテキストがめちゃくちゃになってたり、それを直すためにエディタの表示がぐちゃぐちゃになってたりしますよね・・
そこで、いい感じにエディタにかける記法を用法別にまとめてみました!
方法 | メリット | デメリット |
---|---|---|
トリプルクォート | シンプル | 改行やインデントが崩れやすい |
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 インデントを守ること'
おわりに
いかがだったでしょうか?
みなさんの好きなプロンプトの書き方が見つかればいいねお願いします!
参考
Discussion