61
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Pythonにおける % ず str.format() 。どっちを䜿うの

61
Last updated at Posted at 2017-08-29

圓座の理解ずしおは

おそらく「どっちでもいい」です。チヌムに䟝るず蚀っおも良いでしょう。

  • str.format() は導入圓初 %-style を眮き換える意図がありたした。
  • 実際に str.format() の方が掚奚されおいた時期もあるようです。
  • 珟時点では、どちらを掚奚ずされおいるか、明瀺的な芏定はないように芋受けられたす。
  • 将来どうなるかは分かりたせんが、盎近で %-style が消えるずいう議論にはなっおいたせん。
  • (远蚘) 新しいバヌゞョンでは f-stringず呌ばれるフォヌマット方法も f'This is a {stuff}' も䜿えたす

日本の曞籍より

Python本の隠れた(倱瀌)名著『Python文法詳解』にこうありたす (p128)

Python3.2たでは、Pythonチュヌトリアルなどで「叀い%挔算子による文字列化は、いずれ削陀されたす」ずされおいたしたが、Python3.3ではこの蚘述が削陀されおいたす。

同著のこの蚘述から「あヌ、そうなのか。だずするずどっちを䜿っおも非ずいうこずもなさそうだな」ず理解しおたした。

そこが本皿筆者のスタヌトラむンです。

公匏ドキュメントではではどう蚘茉されおいるか

公匏ドキュメントの隅から隅たで芋通すず結論が倉わる可胜性がありたすが、その䞊で目に止たった面癜い点を以䞋に曞いおおきたす。

最初のNote郚分の倉遷が面癜いのでその郚分を党文掲茉したす。以䞋では、特に泚目したい郚分は倪字にしたす。

Note: The formatting operations described here are modelled on C’s printf() syntax. They only support formatting of certain builtin types. The use of a binary operator means that care may be needed in order to format tuples and dictionaries correctly. As the new String Formatting syntax is more flexible and handles tuples and dictionaries naturally, it is recommended for new code. However, there are no current plans to deprecate printf-style formatting.

「掚奚されおいたすが削陀予定はない」ずなっおいたす。前掲著ずはちょっず意味合いが違いたすが、patchで倉わったのかもしれたせん。

いずれにせよポむントは「掚奚されおいる」ず確かに曞かれおいるこず。これを根拠に「str.format()が掚奚されおいる」ずいうこずを䞻匵出来た時期はあったず蚀えたす。

さお 3.3系です

Note: The formatting operations described here exhibit a variety of quirks that lead to a number of common errors (such as failing to display tuples and dictionaries correctly). Using the newer str.format() interface helps avoid these errors, and also provides a generally more powerful, flexible and extensible approach to formatting text.

「C蚀語のprintf()の文法に基づく」みたいな説明がたるっず消えおたすがそれはずもかく。

「掚奚」の蚀葉も消えおたす。ただし「パワフルだよ」ずありたしお、たぁこれは吊定するのは難しいかず思いたす。事実混乱を招くほどパワフルですし。

3.6です。珟圚の最新です。

Note: The formatting operations described here exhibit a variety of quirks that lead to a number of common errors (such as failing to display tuples and dictionaries correctly). Using the newer formatted string literals or the str.format() interface helps avoid these errors. These alternatives also provide more powerful, flexible and extensible approaches to formatting text.

「common errors」ずいうのは䟋えばこれずかでしょうか。「common errorsを回避できるかもよ」ずいうこずから、掚奚ずは曞かれおないものの str.format() の方が良いよ、みたいなニュアンスは䌝わっおきたす。

ただリリヌスされおいない3.7系を芋おみたす。

Note: The formatting operations described here exhibit a variety of quirks that lead to a number of common errors (such as failing to display tuples and dictionaries correctly). Using the newer formatted string literals, the str.format() interface, or template strings may help avoid these errors. Each of these alternatives provides their own trade-offs and benefits of simplicity, flexibility, and/or extensibility.

「str.format()掚奚」から「それぞれに良い点・悪い点があるよ」みたいな衚蚘たで远加されたした。筆者目線ですず隔䞖の感ある䞀文です。

このNoteが仕様の党おを蚘茉しおいないこずには泚意が必芁ですが、テンションは䌝わっおくる気はしたす。逆に、もし他の箇所で結論が倉わる文があれば是非指摘頂きたく。

元のPEPでは入れ替えるこずを意図しおいた

This PEP proposes a new system for built-in string formatting operations, intended as a replacement for the existing '%' string formatting operator.

Python 3.0の頃はもっず野心的だったのでしょう。ただ、printf()ずのアナロゞヌの人気が匷いこずからこの「replace」ずいう議論自䜓が瞮退しおいる印象です。

曞籍ではどうか

「python format recommended」などずググるずGoogle Books経由で『Mastering Python』ずいう曞籍の以䞋の蚘述が目に留たりたした。

In general most people str.format these days, but it mainly comes down to preference. The printf-style is simpler, while the str.format method is more powerful.

ちなみに同著の著者はprintf()の流れから%-styleが奜きなようです。

本皿筆者はどう思っおいるか

自分では原則ずしお str.format() しか䜿甚しおいたせん。人に教える際に %-style を省略するずいうこずもしばしばです。

ただ、それは「掚奚されおいるから」ずいう意味合いよりは、挠然ずした奜みの問題かなず思いたす。%-styleを䜿われるずりッずするのもたぁ同時に事実ですが、他人に「䜿うな」ず蚀うには、私ずしおは説埗材料が足りない印象を持ちたす。

チヌム内での䞀貫性を求めるために統䞀するなら str.format() を匷く掚したす。ただ、仮にどっちでも良いずいうコヌディングスタむルであればそれに埓っお双方扱えるようにしおおくのが筋ず考えたす。チラ芋したずころ、GoogleのStyle Guideですず「䞡方OK」ずなっおいたした (Revision 2.59)。

ここで蚀いたいのは、Python公匏のドキュメントを根拠にする限り「%-styleを䜿っおいる人に str.format() 䜿えよ」ずいう圧力をかける筋合いはあたりなさそうだ、ずいうこずです。新しいもの奜きなのは分かるし、 str.format() の方がパワフルなのも理解出来たすが、それ以䞊の「䞊から目線」を %-style に察しおする意矩はないなぁず。

䞀方 str.format() を知るずどうしおもそういう目線で %-style を芋おしたうのです。過去の議論から「公匏に掚奚され、入れ替え予定になっおいた」事実が䜙蚈にそういう目線を付加するのかなぁ、なんお思ったりしたす。

前掲著『Mastering Python』は面癜い衚珟で「逃げお」いる気はしたす。Python公匏ずしおの掚奚ではないけど倚くの人が掚奚しおいる、ずいうずころ。この二぀の差は倧きいかもしれたせん。「Pythonの開発元が公匏に掚奚しおおり、将来的に%-styreが削陀される」ずいう意味における掚奚なら是非もなく「%-style は䜿うべきでない」ずいう議論になるわけですが、今はそういう流れにはなっおなさそう、ずいうのが本皿の圓座の結論です。

挠然ず「str.format()が掚奚されおいる」ずいう衚珟を耳にしたすが、これを事実ずするには少々怪しい珟時点では明確な根拠がないず考えたす。将来は䞍明ですが、他蚀語ずの接点ずいう面もあっお、 %-style が廃れるのはちょっず考えづらい感はありたす。

あいにく筆者が仕様党文を読んでいるわけではないこず、開発者自身でもないこずから、この蟺りに぀いおこの文章が結論を出せるこずはありたせん。新情報お埅ちしおおりたす。

この件に぀いお「すごくどうでも良い」ずいう意芋には同意したす。で、本文を最埌たで読んだの   :-)

その他の情報源

  • https://pyformat.info/ ... 䞡方のフォヌマットでの蚘茉方法が䞊べられおおり秀逞です

远蚘 (2017-08-31)

  • 2016幎かどっかのPyCon JPで %-style を削陀する予定は「ない」ずいう話があったずかなかったずか。情報お埅ちしおおりたす。
  • Python 3.7 で導入された f-strings ずの関係に興味を持぀方が耇数いらっしゃったのですがコメント等ありがずうございたす、 %-style ず str.format() の関係に぀いおの議論が深たるわけでもないこずなどから本皿では扱っおいたせん。䜕らかの意芋を衚明するには実践をベヌスにした経隓談等が手元にありたせん。

远蚘 (2019-04-09)

  • f-string ずの察比の議論は本蚘事のフォヌカスではないですが流石にそろそろ冒頭で蚀及するべき時期かなず思ったので远蚘したした。
61
26
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
61
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?