2009-07-31 14 views
2

異なるバージョンのインタプリタを使用する異なる環境でpythonスクリプトを実行すると、テキストのフォーマットがバージョンによって異なるため、問題が発生します。 pythonで> = 2.6 best way to do itであるのに対し異なるバージョンのPythonでのテキスト書式設定

n = 3 
print "%s * %s = %s" % (n, n, n*n) 

:スクリプトがでrunnedしたいときについて

n = 3 
print "{0} * {0} = {1}".format(n, n*n) 

しかし、どのようにPythonの< 2.6では

は、それがこのように行われています任意のPythonのバージョン? Python < 2.6のコードを書いて、すぐに使用できるようにするか、将来使用するPython> = 2.6コードを使用すると良いでしょうか?

oldersとの互換性を失うことなく、実際のP​​ythonバージョンのコードを書くための他のオプションはありますか?

おかげ

答えて

3

str.format()はPython 2.6で導入され、そののみPython 3.0でフォーマットストリングの好適な方法となりました。

Python 2.6では、両方の方法が引き続き機能します。

すべては、コードのコンシューマが誰になるかによって異なります。あなたのユーザーの大多数がPython 3.0を使用しないことが予想される場合は、古い書式を使用してください。

しかし、プロジェクトに必要なフィーチャーがPython 3.0にある場合、ユーザーに特定のバージョンのインタープリタを使用するように要求するのは無理ではありません。 Python 3.0では3.0より前のコードが壊れていることに注意してください。

したがって、Python 3.0をターゲットにしている場合は、str.format()を使用します。 Pyhon < 3.0をターゲットにしている場合は、%フォーマットを使用してください。

+1

彼はprintをステートメントとして使用していることを考慮すると、おそらくPython <3をターゲットにしているので、パーセント演算子を使用するのは問題ありません。 – balpha

+1

はい、正しいです.Python 3では、print()関数を代わりに使う必要があります。 –

+0

2番目のコードはPython 2.6で使用することを意図しています。コードをPython 3に移植したいのであれば、2to3ツールでは簡単です。 主な問題はテキストの書式設定にありますが、今はPython <2.6コードを使用すると思います... – ramosg

1

良い古いタプルまたは文字列連結はどうですか?

print n, "*", n, "=", n*n 
#or 
print str(n) + " * " + str(n) + " = " + str(n*n) 

これはファンシーではありませんが、どのバージョンでも動作するはずです。それはあまりにも冗長だ場合

、多分カスタム関数を助けることができる:

def format(fmt, values, sep="%%"): 
    return "".join(str(j) for i in zip(fmt.split(sep), values) for j in i) 

#usage 
format("%% * %% = %%", [n, n, n*n]) 
+0

はい、それはオプションですが、置換するために3つまたは4つの変数を持つ関数の引数としてテキストを渡すときにはかなり醜いです... – ramosg

+0

文字列連結の問題は、ローカリゼーションを大幅に難しくすることです。別の言語に翻訳したいのであれば、最初の問題は変数の自然順序が異なることです。次に、翻訳する文字列が増えます。文字列の断片しかないのでさらに難しくなります。翻訳者は、各文字列の使用方法や、ローカリゼーションファイルの断片だけを見ることはできません。どのように翻訳すべきかを推測するためにソースを読むことを期待するならば、あなたは反乱を起こすでしょう! – SingleNegationElimination

0

あなたは、文字列をフォーマットするstring.Template (link for 3.1)方法を見ている必要があり、APIは、すべてのバージョン> = 2.5間で安定しています。 私は、連結は古いものと新しいPythonの両方の移植性を実現する簡単な方法だと思います。明らかに、それは選択肢よりも遅く、冗長で、ピギーソニックではありません。

関連する問題