2012-06-13 12 views
12

で、私は次のPythonコード(私はPythonの2.7.35を使用しています)を持っている:String.Formatの()オプションのプレースホルダ

my_csv = '{first},{middle},{last}' 
print(my_csv.format(first='John', last='Doe')) 

「真ん中」が指定されていないので、私はこれがある(KeyError例外を取得期待される)。しかし、私はそれらのプレースホルダーのすべてをオプションにしたい。これらの名前付きパラメータが指定されていない場合は、プレースホルダを削除する必要があります。したがって、上記の文字列は次のようになります。

John,,Doe 

これらのプレースホルダをオプションにするための機能が組み込まれているのか、さらに深い作業が必要ですか?後者の場合、誰かが私にそれを感謝する最も簡単なソリューションを表示することができます!ここで

答えて

14

は一つの選択肢は次のとおりです。また、でしょう、あなたがより近代的なstr.format()方法を使用して好む場合は、

また
class DataDict(dict): 
    def __missing__(self, key): 
     return '' 

my_csv = '%(first)s,%(middle)s,%(last)s' 
print my_csv % DataDict(first='John', last='Doe') # John,,Doe 

from collections import defaultdict 

my_csv = '{d[first]},{d[middle]},{d[last]}' 
print(my_csv.format(d=defaultdict(str, first='John', last='Doe'))) 
+0

私はあなたが 'str'を使用しているのを見ています。これは何ですか?編集:これは、変数名ではなく、ファクトリメソッドであることがわかりました。したがって、工場は空の文字列を作成します。 –

5

はここで、文字列の補間オペレータ%を使用する別のオプションですすべての可能なプレースホルダを明示的に定義する必要があります(ただし、になります)DataDict.placeholders on-th必要に応じて)電子飛ぶ:

class DataDict(dict): 
    placeholders = 'first', 'middle', 'last' 
    default_value = '' 
    def __init__(self, *args, **kwargs): 
     self.update(dict.fromkeys(self.placeholders, self.default_value)) 
     dict.__init__(self, *args, **kwargs) 

my_csv = '{first},{middle},{last}' 
print(my_csv.format(**DataDict(first='John', last='Doe'))) # John,,Doe 
2
"It does{cond} contain the the thing.".format(cond="" if condition else " not") 

思想、それが機能していますので、私は質問が尋ねられたことから、質問がまだ初期のGoogleの検索結果でのポップアップし、そしてこの方法を直接構築され、これを追加したいです(インポートやカスタムクラスは必要ありません)。それは簡単なshortcut conditional statementです。彼らは直感的に読むことができます(シンプルに保たれている場合)。short-circuitが役立つことがよくあります。

+0

回答は常に高く評価されていますが、この質問は5年前に尋ねられ、回答されており、すでに解決策がありました。また、コードがどのように問題を解決しているかについていくつかの情報を提供するのにも役立ちます。いくつかの[回答を取り巻く文脈](https://meta.stackexchange.com/a/148274)を入力し、[ヘルプ記事](http://stackoverflow.com/help/how-to-answer)を参照してください。偉大な答えを書く方法に関する情報:) –