この記事は Pythonのコードを短く簡潔に書くテクニック Advent Calendar 2017 の12日目です。
はじめに
ソースコード内で長い文字列リテラルを定義したいときに、+や+=で複数の文字列を結合したりしてませんか?
Pythonの文法ではもっとスマートなやり方が2つ用意されています。
- ヒアドキュメント(
'''...''') - 文字列リテラルを連続して並べる(
'...' '...')
例題
例題として、改行を含まない文字列と、改行を含む文字列を定義する方法を考えます。
Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」ですので、再利用性・汎用性の高い情報が多く集まっている場をつくっていきたいと考えています。そのためには、記事を読むこと、記事を書くことを通して、読む側・書く側それぞれがお互いに関わり合って、再利用性・汎用性の高い情報を育てていきましょう。
Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」ですので、
再利用性・汎用性の高い情報が多く集まっている場をつくっていきたいと考えています。
そのためには、記事を読むこと、記事を書くことを通して、
読む側・書く側それぞれがお互いに関わり合って、
再利用性・汎用性の高い情報を育てていきましょう。
普通に文字列結合する場合
msg = 'Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」ですので、'
msg += '再利用性・汎用性の高い情報が多く集まっている場をつくっていきたいと考えています。'
msg += 'そのためには、記事を読むこと、記事を書くことを通して、'
msg += '読む側・書く側それぞれがお互いに関わり合って、'
msg += '再利用性・汎用性の高い情報を育てていきましょう。'
msg = 'Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」ですので、\n'
msg += '再利用性・汎用性の高い情報が多く集まっている場をつくっていきたいと考えています。\n'
msg += 'そのためには、記事を読むこと、記事を書くことを通して、\n'
msg += '読む側・書く側それぞれがお互いに関わり合って、\n'
msg += '再利用性・汎用性の高い情報を育てていきましょう。\n'
どちらもmsg += というのが並んでてイケてないですね。
行末の\nも面倒です。
ヒアドキュメント('''...''')を使う場合
文字列を三連引用符('''...''')で囲うことでいわゆるヒアドキュメントを定義できます。
ヒアドキュメント内での改行はそのまま文字列内の改行になります。
改行を文字列に含めたくないときは行末に\を追加します。
msg = '''\
Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」ですので、\
再利用性・汎用性の高い情報が多く集まっている場をつくっていきたいと考えています。\
そのためには、記事を読むこと、記事を書くことを通して、\
読む側・書く側それぞれがお互いに関わり合って、\
再利用性・汎用性の高い情報を育てていきましょう。\
'''
msg = '''\
Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」ですので、
再利用性・汎用性の高い情報が多く集まっている場をつくっていきたいと考えています。
そのためには、記事を読むこと、記事を書くことを通して、
読む側・書く側それぞれがお互いに関わり合って、
再利用性・汎用性の高い情報を育てていきましょう。
'''
ソースコード上はインデントしたいけど文字列にインデントを含めたくないときはtextwrap.dedent()を使うことで各行に共通して現れる先頭の空白を取り除くことができます。
import textwrap
msg = textwrap.dedent('''\
Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」ですので、
再利用性・汎用性の高い情報が多く集まっている場をつくっていきたいと考えています。
そのためには、記事を読むこと、記事を書くことを通して、
読む側・書く側それぞれがお互いに関わり合って、
再利用性・汎用性の高い情報を育てていきましょう。
''')
文字列リテラルを連続して並べる('...' '...')を使う場合
Pythonでは文字列リテラルを連続して並べると自動的に連結してくれます。
>>> 'py' 'thon'
'python'
これを使えば長い文字列も複数行に分割して定義することができます。
ただし改行を含む文字列を定義したい時は\nが必要です。
msg = ('Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」ですので、'
'再利用性・汎用性の高い情報が多く集まっている場をつくっていきたいと考えています。'
'そのためには、記事を読むこと、記事を書くことを通して、'
'読む側・書く側それぞれがお互いに関わり合って、'
'再利用性・汎用性の高い情報を育てていきましょう。')
msg = ('Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」ですので、\n'
'再利用性・汎用性の高い情報が多く集まっている場をつくっていきたいと考えています。\n'
'そのためには、記事を読むこと、記事を書くことを通して、\n'
'読む側・書く側それぞれがお互いに関わり合って、\n'
'再利用性・汎用性の高い情報を育てていきましょう。\n')
結論
- 改行なしの長い文字列
-
'...' '...'を使ったほうが簡潔に書ける
-
- 改行ありの長い文字列
- ヒアドキュメント(
'''...''')を使ったほうが簡潔に書ける - インデントしたいときは
textwrap.dedent()を使う
- ヒアドキュメント(
参考
- Python3 ドキュメント
- チュートリアル
- ライブラリーリファレンス