以下を行う最も慣用的な方法は何ですか?
def xstr(s):
if s is None:
return ''
else:
return s
s = xstr(a) + xstr(b)
更新:私は、strptを使用するためのTryptichの提案を取り入れています。 Vinay Sajipのラムダ提案に非常に感銘を受けましたが、コードを比較的シンプルに保ちたいと思います。
def xstr(s):
if s is None:
return ''
else:
return str(s)
実際に関数をstr()
ビルトインのように動作させたいが、引数がNoneのときに空の文字列を返すようにするには、次のようにします。
def xstr(s):
if s is None:
return ''
return str(s)
def xstr(s):
return '' if s is None else str(s)
値が常に文字列またはNoneであることがわかっている場合:
xstr = lambda s: s or ""
print xstr("a") + xstr("b") # -> 'ab'
print xstr("a") + xstr(None) # -> 'a'
print xstr(None) + xstr("b") # -> 'b'
print xstr(None) + xstr(None) # -> ''
おそらく最短はstr(s or '')
です
NoneはFalseであり、xがfalseの場合、「x or y」はyを返します。詳細な説明については、 ブール演算子 を参照してください。短いですが、あまり明確ではありません。
return s or ''
は、指定された問題に対してうまく機能します!
def xstr(s):
return s or ""
def xstr(s):
return {None:''}.get(s, s)
機能的な方法(ワンライナー)
xstr = lambda s: '' if s is None else s
私は最大関数を使用します:
max(None, '') #Returns blank
max("Hello",'') #Returns Hello
チャームのように機能します;)文字列を関数の最初のパラメーターに入れるだけです。
他の回答のいくつかでこの構築を行うためのきちんとしたワンライナー:
s = (lambda v: v or '')(a) + (lambda v: v or '')(b)
または単に:
s = (a or '') + (b or '')
Python 2.4との互換性が必要な場合は上記のバリエーション
xstr = lambda s: s is not None and s or ''
以下で説明するシナリオでは、型キャストを常に回避できます。
customer = "John"
name = str(customer)
if name is None
print "Name is blank"
else:
print "Customer name : " + name
上記の例では、変数customerの値がNoneの場合、「name」に割り当てられている間にさらにキャストされます。 'if'句の比較は常に失敗します。
customer = "John" # even though its None still it will work properly.
name = customer
if name is None
print "Name is blank"
else:
print "Customer name : " + str(name)
上記の例は適切に機能します。このようなシナリオは、URL、JSON、またはXMLから値を取得する場合、または値を操作するためにさらに型キャストする必要がある場合に非常に一般的です。
def xstr(s):
return s if s else ''
s = "%s%s" % (xstr(a), xstr(b))
文字列のフォーマットのみに関する場合は、次のことができます。
from string import Formatter
class NoneAsEmptyFormatter(Formatter):
def get_value(self, key, args, kwargs):
v = super().get_value(key, args, kwargs)
return '' if v is None else v
fmt = NoneAsEmptyFormatter()
s = fmt.format('{}{}', a, b)
短絡評価を使用します。
s = a or '' + b or ''
+は文字列に対して非常に適切な操作ではないため、フォーマット文字列をより適切に使用します。
s = "%s%s" % (a or '', b or '')