web-dev-qa-db-ja.com

Pythonの文字列フォーマットの多くの方法—古い方法(廃止予定)は非推奨ですか?

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-- stringsは、Python 3.6で導入されました

私の質問は:

  • printfスタイルのフォーマットは廃止されますか、廃止される予定ですか?
  • Template classで、substituteメソッドは非推奨ですか、または非推奨になりますか? (私はsafe_substituteについて話しているのではなく、それは私が理解しているようにユニークな機能を提供します)

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

こちらもご覧ください

94
gerrit

ドキュメントには.formatおよびf-stringsが%文字列よりも優れているというさまざまな指摘がありますが、後者を廃止する計画は残っていません。

コミット中 Issue#14123:古いスタイルの%文字列フォーマットには注意点があるが、すぐには消えないことを明示的に言及する。 、問題に触発された printfスタイルの書式設定を非推奨にする現在の計画がないことを示します%- formattingのドキュメントは次のフレーズを含むように編集されました。

新しい文字列フォーマット構文はより柔軟で、タプルと辞書を自然に処理するため、新しいコードに推奨されます。ただし、printfスタイルのフォーマットを非推奨にする現在の計画はありません

(エンファシス鉱山。)

この句は後でコミットで削除されました Close#4966:現代のPython の状態をよりよく説明するためにシーケンスドキュメントを改良しました。これは%フォーマットを廃止する計画がカードに戻ったという兆候のように思えるかもしれませんが、バグトラッカーに飛び込むと意図が反対であることが明らかになります。バグトラッカーでは、コミットの作成者が変更を特徴づけます like this

  • printfスタイルの書式設定とstr.formatメソッドの関係を説明する散文を変更しました(前者が消える本当の危険であるという意味を意図的に削除します-それを殺すことを真剣に検討することは単に実用的ではありません)

言い換えると、明示的に強調することを意図した%- formatting docsに2つの連続した変更がありますnot非推奨、削除はおろか。ドキュメントは、さまざまな種類の文字列フォーマットの相対的なメリットについて意見を表明し続けていますが、%-フォーマットが非推奨または削除されないことも明らかです。

さらに、 その段落の最新の変更 、2017年3月に、これから変更されました...

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

...これに:

ここで説明するフォーマット操作には、多くの一般的なエラー(タプルや辞書を正しく表示できないなど)につながるさまざまな癖があります。新しい形式の文字列リテラル、str.formatインターフェイス、またはテンプレート文字列を使用すると、これらのエラーを回避できる場合があります。これらの各選択肢は、単純さ、柔軟性、および/または拡張性というトレードオフと利点を提供します。

「回避に役立つ」から「回避に役立つ」への変更、および.formatおよびf-stringsの明確な推奨が、各スタイルが提供する方法に関するふわふわした曖昧な散文に置き換えられたことに注意してください。独自のトレードオフとメリット」。つまり、正式な非推奨がカードにないだけでなく、現在のドキュメントは、%フォーマットが少なくとも他のアプローチに比べて「メリット」があることを公然と認めています。

%フォーマットを廃止または削除する動きは、行き詰まっただけでなく、完全かつ永久に打ち負かされたと私は推測します。

7
Mark Amery

新しい .format() method は、古い%フォーマット構文を置き換えるためのものです。後者は重要視されていません(ただし、公式には非推奨ではありませんyet)。メソッドのドキュメントには次のように記載されています。

この文字列フォーマットの方法は、Python 3の新しい標準であり、 で説明されている%フォーマットよりshouldが望ましい]文字列フォーマット操作 新しいコード。

(エンファシス鉱山)。

後方互換性を維持し、移行を容易にするために、古い形式は現在のところのままになっています。元の PEP 3101提案から

下位互換性

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

古いシステムを廃止する時が来るまでに注意してください;非推奨ではありませんが、新しいコードを記述するたびに新しいシステムが使用されます。

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

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

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

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

Python 3は非推奨からさらに離れ、代わりに printf- style String Formattingsection で警告を出します:

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

Python 3.6では、 フォーマットされた文字列リテラル も追加されました。これは、式にフォーマット文字列にインライン化します。これらは、補間された値で文字列を作成する最速の方法であり、str.format()の代わりに使用できます。

54
Martijn Pieters

文字列の書式設定のための%演算子は非推奨ではなく、他の回答にも関わらず削除されません。
サブジェクトがPython開発リスト)で提起されるたびに、優れた論争がありますが、古典的な方法を削除するかどうかについての論争はありません。 PEP 3101で示されているPython 3.1が出入りしており、%フォーマットはまだ残っています。

古典的なスタイルを維持するための声明は明確です。それは単純で、高速で、短いことでも迅速に行うことができます。 .formatメソッドを使用することは、コア開発者の間でも常に読みやすいわけではなく、ほとんど誰でも-参照を見なくても.formatによって提供される完全な構文を使用できます。次のようなメッセージ: http://mail.python.org/pipermail/python-dev/2009-October/092529.html -以降、件名はほとんどリストに表示されませんでした。

2016 update

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

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

>>> value = 80
>>> f'The value is {value}.'
'The value is 80.'
43
jsbueno

これに関するグイドの最新の立場は、ここに示されているようです:

新機能Python 3.

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

組み込みの文字列フォーマット操作のための新しいシステムは、%文字列フォーマット演算子を置き換えます。 (ただし、%演算子は引き続きサポートされています。Python 3.1で廃止され、しばらくして言語から削除されます。)完全なスクープについては、PEP 3101をお読みください。

そして PEP3101 自体は、最後に変更された日付(2011年9月30日、金曜日)であるため、その時点で進展はないと思われます。

20
GSP

古いPython docsとPEP 3101を見ると、%演算子は非推奨になり、将来言語から削除されるというステートメントがありました。 次のステートメント はPython Python 3.0、3.1、および3.2のドキュメント:

Str.format()は非常に新しいため、多くのPythonコードは依然として%演算子を使用しています。ただし、この古いスタイルのフォーマットは最終的に言語から削除されるため、str.format( )一般的に使用する必要があります。

同じセクション in Python 3.3 and 3.4 docs)にアクセスすると、そのステートメントが削除されていることがわかります。また、また、演算子が非推奨または言語から削除されることを示すドキュメント PEP3101 は2年半以上変更されていないことに注意することも重要です(金、2011年9月30日)。

更新

PEP461 バイトおよびバイト配列に%フォーマットを追加することは受け入れられ、Python 3.5または3.6の一部である必要があります。

18