Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
43
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

長い文字列リテラルの定義にはヒアドキュメントや('...' '...')が便利

この記事は 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()を使う

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
43
Help us understand the problem. What are the problem?