112

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(私が理解しているように、独自の機能を提供するについては話していません)

同様の質問と、それらが重複していないと思う理由:

  • Python 文字列の書式設定: % と .format — 方法 1 と 2 のみを扱い、どちらが優れているかを尋ねます。私の質問は、Zen of Python に照らして非推奨であることを明確に示しています

  • 文字列の書式設定オプション: 長所と短所— 質問では方法 1a と 1b、回答では方法 1 と 2 のみを扱い、非推奨については何も扱いません

  • 高度な文字列フォーマットとテンプレート文字列— 主に方法 1 と 3 に関するものであり、廃止予定については触れていません

  • 文字列書式設定式 (Python)元の '%' アプローチは非推奨になる予定であることが回答に記載されています。しかし、計画された非推奨保留中の非推奨、実際の非推奨の違いは何ですか? そして、printf-style メソッドは a さえ発生させないPendingDeprecationWarningので、これは本当に非推奨になるのでしょうか? この記事もかなり古いので、情報が古くなっている可能性があります。

こちらもご覧ください

4

5 に答える 5

58

新しい.format()メソッド%は、古い書式設定構文を置き換えることを目的としています。後者は強調されていません (ただし、公式にはまだ非推奨ではありません)。メソッドのドキュメントには、次のように記載されています。

この文字列フォーマットの方法は、Python 3 の新しい標準であり、新しいコードでの文字列フォーマット操作で説明されているフォーマットよりも優先されるべきです。%

(強調鉱山)。

下位互換性を維持し、移行を容易にするために、現在は古い形式がそのまま残されています。元のPEP 3101 提案から:

下位互換性

下位互換性は、既存のメカニズムをそのままにしておくことで維持できます。新しいシステムは、既存の文字列フォーマット手法のメソッド名と衝突しないため、古いシステムが廃止されるまで、両方のシステムを共存させることができます。

古いシステムを廃止する時が来るまで注意してください。廃止されたわけではありませんが、新しいコードを書くときは常に新しいシステムが使用されます。

新しいシステムには、古いフォーマッタのタプルと辞書のアプローチを組み合わせることができるという利点があります。%

"{greeting}, {0}".format(world, greeting='Hello')

object.__format__()個々の値のフォーマットを処理するために使用されるフックを介して拡張可能です。

古いシステム%にはTemplateクラスがあり、後者ではその動作を追加または変更するサブクラスを作成できることに注意してください。新しいスタイルのシステムには、同じニッチを満たすFormatterクラスがあります。

Python 3 は非推奨からさらに遠ざかっており、代わりにprintf-style String Formattingセクションで警告を出しています:

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

Python 3.6 では、式書式文字列にインライン化する書式付き文字列リテラルも追加されました。これらは、補間された値で文字列を作成する最速の方法であり、リテラルを使用できる場所ではなく、代わりに使用する必要があります。str.format()

于 2012-11-19T10:57:05.907 に答える
47

他の回答にもかかわらず、文字列フォーマットの%演算子は非推奨ではなく、削除される予定もありません。
このテーマが Python 開発リストで取り上げられるたびに、どちらが優れているかについて激しい論争がありますが、古典的な方法を削除するかどうかについての論争はありません。PEP 3101 で示されているにもかかわらず、Python 3.1 は出てきては消えており、%フォーマットはまだ残っています。

クラシックなスタイルを維持するためのステートメントは明確です。それはシンプルであり、迅速であり、短いことをすばやく実行できます。この.formatメソッドを使用すると、常に読みやすくなるとは限りません。コア開発者の間でさえ.format、リファレンスを見なくてもによって提供される完全な構文を使用できる人はほとんどいません。 python.org/pipermail/python-dev/2009-October/092529.html - それ以来、件名はほとんどリストに表示されていませんでした。

2016年更新

現在の Python 開発バージョン (Python 3.6 になる予定) には、PEP-0498で説明されている文字列補間の 3 番目の方法があります。これは、新しい引用プレフィックスを定義しますf""(現在のu"",b""およびに加えてr"")。

文字列の前に byを付けるfと、実行時に文字列オブジェクトのメソッドが呼び出され、現在のスコープの変数が文字列に自動的に挿入されます。

>>> value = 80
>>> f'The value is {value}.'
'The value is 80.'
于 2012-11-19T13:29:46.323 に答える
19

これに関する Guido の最新の立場は、次のように示されているようです。

Python 3.0 の新機能

PEP 3101: 文字列フォーマットへの新しいアプローチ

組み込みの文字列書式設定操作の新しいシステムは、% 文字列書式設定演算子に取って代わります。(ただし、% 演算子は引き続きサポートされています。Python 3.1 で非推奨になり、後で言語から削除されます。) 完全なスクープについては、PEP 3101 を参照してください。

そして、PEP3101自体は (2011 年 9 月 30 日、金) にさかのぼって最後に変更されたものであるため、最近になっても進展はないと思います。

于 2012-11-19T11:00:00.710 に答える