2016-01-05 15 views
9

オブジェクトIDを取得するリクエストを実行するアプリケーションを開発しています。それぞれの後に、このIDを引数として渡すメソッド(get_actor_info())を呼び出します(以下のコードを参照)。Python文字列の書式設定:%対連結

ACTOR_CACHE_KEY_PREFIX = 'actor_' 

def get_actor_info(actor_id): 
    cache_key = ACTOR_CACHE_KEY_PREFIX + str(actor_id) 

としては、私がstringactor_idをキャストし、接頭辞とそれを連結するよ、気づいたことができます。しかし、私は複数の他の方法(.format()または'%s%d'など)でそれを行うことができ、それは私の質問になります:'%s%d'可読性、コードの慣習と効率の点で文字列の連結より良いでしょうか?それがパフォーマンスに来るとき

おかげ

+0

あなた自身で確認できます:https://docs.python.org/2/library/timeit.html –

+1

ありがとう@brunodesthuilliers!しかし、これは質問の時間効率の部分だけに答えます。 –

+2

はい、申し訳ありませんがwrt /可読性と慣習では、答えは簡単です: '.format()'を使用してください。 –

答えて

9

これは簡単に意見に基づくスレッドになる可能性がありますが、ほとんどの場合、より読みやすく、保守性の高い書式設定が可能です。 「精神的連結」をせずに、最終的な文字列がどのように見えるかを視覚化する方が簡単です。どれが読みやすいですか?

errorString = "Exception occurred ({}) while executing '{}': {}".format(
    e.__class__.__name__, task.name, str(e) 
) 

または:

errorString = "Exception occurred (" + e.__class__.__name__ 
    + ") while executing '" + task.name + "': " + str(e) 

%または .format()を使用するかどうかについては、私はより客観的に答えることができる:使用 .format()

str.format()はかなり新しいですので、Pythonのコードの多くは、まだ%演算子を使用しています:%Python Documentationごとに、彼らはすぐに除去することができる、「古いスタイル」で、そして。しかし、この古い形式の書式は最終的に言語から削除されるため、通常はstr.format()が使用されます。

それ以降のバージョンのドキュメントではこれに言及していませんが、それにもかかわらず.format()は未来の方法です。これを使って!

連結は高速ですが、それは問題ではありません。コードを読みやすく保守しやすくし、後で最適化するために必要な部分を最適化します。

ACTOR_CACHE_KEY_PREFIX = 'actor_' 

def get_actor_info(actor_id): 
    cache_key = f'{ACTOR_CACHE_KEY_PREFIX}{actor_id}' 

パフォーマンスが'{}{}'.format(ACTOR_CACHE_KEY_PREFIX, actor_id)に匹敵する必要がありますが、間違いなく、より読みやすいです:

4

連結が良いです。あなたの例では、連結と置換の両方が判読可能ですが、より複雑なテンプレートについて言えば、置換はシンプルさと可読性の競争に勝ちます。

たとえば、データがあり、htmlで表示したい場合、連結は頭痛を引き起こしますが、置換はシンプルで読みやすくなります。

+0

パフォーマンスが悪い場合、連結が悪化します。 https:// waymootを参照してください。org/home/python_string /およびhttp://leadsift.com/python-string-concatenation/ – jalanb

2

のPython 3.6はまだ別のオプションを紹介します);早期の最適化は諸悪の根源です。