1. ホーム
  2. python

[解決済み] Pythonの様々な文字列フォーマット - 古いものは(今後)非推奨?

2022-10-18 10:07:12

質問

Pythonには文字列をフォーマットする方法が少なくとも6つあります。

In [1]: world = "Earth"

# method 1a
In [2]: "Hello, %s" % world
Out[2]: 'Hello, Earth'

# method 1b
In [3]: "Hello, %(planet)s" % {"planet": world}
Out[3]: 'Hello, Earth'

# method 2a
In [4]: "Hello, {0}".format(world)
Out[4]: 'Hello, Earth'

# method 2b
In [5]: "Hello, {planet}".format(planet=world)
Out[5]: 'Hello, Earth'

# method 2c
In [6]: f"Hello, {world}"
Out[6]: 'Hello, Earth'

In [7]: from string import Template

# method 3
In [8]: Template("Hello, $planet").substitute(planet=world)
Out[8]: 'Hello, Earth'

さまざまな手法の歴史を簡単に紹介します。

  • printf -スタイルフォーマットはPythonの初期から存在する
  • Template クラスは Python 2.4 で導入されました。
  • format メソッドは Python 2.6 で導入されました。
  • f -文字列は Python 3.6 で導入されました。

私の質問です。

  • printf -スタイルの書式設定は非推奨ですか、または非推奨になる予定ですか?
  • Template classsubstitute メソッドは非推奨なのでしょうか、あるいは非推奨になりそうなのでしょうか?(私は safe_substitute について話しているわけではなく、私が理解しているように、それはユニークな機能を提供しています)

同様の質問と、それらが重複していないと私が考える理由。

こちらもご覧ください

どのように解決するのですか?

ドキュメントには様々な示唆がありますが .format とf-stringの方が % 文字列よりも優れており、後者を非推奨とする計画は残っていません。

コミットでは 問題番号 14123。古いスタイルの % 文字列フォーマットには注意点があるが、すぐにはなくならないことを明示的に言及しました。 この問題に触発されて printf スタイルの書式を廃止する現在の計画がないことを示す のドキュメントは % -のドキュメントが編集され、このフレーズが含まれるようになりました。

新しい文字列フォーマット構文はより柔軟で、タプルと辞書を自然に処理するため、新しいコードにはこれが推奨されます。しかし printfスタイルのフォーマットを廃止する予定は今のところありません。 .

(強調)

このフレーズは、後にコミットで削除されました Close #4966: 最近の Python の状態をよりよく説明するためにシーケンスドキュメントを改訂しました。 . これは % フォーマットを廃止する計画が再び持ち上がったことを示すように思えるかもしれません。しかし、バグトラッカーに潜入してみると、その意図が逆であることがわかります。バグトラッカーでは、このコミットの著者はこの変更を次のように説明しています。 をこのように説明しています。 :

  • printf スタイルのフォーマットと str.format メソッドの関係を説明する文章を変更しました (前者が本当に消滅する危険があるという含意を意図的に削除しています - 私たちにとって、これを殺すことを真剣に考えるのは単に実用的ではありません)。

言い換えれば、私たちは 2 つの連続した変更で % -formatting docs の意図するところは を明示的に強調する であることを ではなく は非推奨であり、削除されることはないでしょう。ドキュメントでは、さまざまな種類の文字列フォーマットの相対的な利点について意見が分かれていますが、同時に % -フォーマットが非推奨になったり削除されたりすることはないでしょう。

さらに、その に対する最新の変更点は、その段落 , 2017年3月に、このように変更されました...

ここで説明したフォーマット操作は、多くの一般的なエラー(タプルや辞書を正しく表示できないなど)につながるさまざまな癖が見られます。より新しいフォーマットされた文字列リテラル、あるいは str.format インタフェースを使用すると、これらのエラーを回避することができます。これらの選択肢はまた、テキストをフォーマットするためのより強力で柔軟かつ拡張可能なアプローチを提供します。

...これに

<ブロッククオート

ここで説明したフォーマット操作は、多くの一般的なエラー(タプルや辞書を正しく表示できないなど)を引き起こす様々な癖があります。新しい書式化された文字列リテラルを使って str.format インターフェースやテンプレート文字列を使うことで、これらのエラーを避けることができるかもしれません。これらの選択肢はそれぞれトレードオフの関係にあり、単純さ、柔軟性、拡張性などの利点があります。

help avoid" から "may help avoid" への変更と、明確な推奨である .format と f-string の明確な推奨が、それぞれのスタイルがどのように が、それぞれのトレードオフと利点を提供するという、ふわっとした不明瞭な文章に置き換えられていることです。 . つまり、正式な非推奨はもはやないだけでなく、現在の docs は以下のことを公然と認めています。 % フォーマットが少なくとも他のアプローチよりもいくつかの利点があることを認めています。

これらのことから推測すると、非推奨または削除される動きとして % フォーマットを非推奨または削除する運動は、挫折しただけでなく、完全にそして永久に敗北したのだと推測されます。