web-dev-qa-db-ja.com

Python:Noneを空の文字列に変換する最も慣用的な方法は?

以下を行う最も慣用的な方法は何ですか?

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)
133
Mark Harrison

実際に関数をstr()ビルトインのように動作させたいが、引数がNoneのときに空の文字列を返すようにするには、次のようにします。

def xstr(s):
    if s is None:
        return ''
    return str(s)
84
Triptych
def xstr(s):
    return '' if s is None else str(s)
133
SilentGhost

値が常に文字列または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) # -> ''
91
Vinay Sajip

おそらく最短はstr(s or '')です

NoneはFalseであり、xがfalseの場合、「x or y」はyを返します。詳細な説明については、 ブール演算子 を参照してください。短いですが、あまり明確ではありません。

79
dorvak

return s or ''は、指定された問題に対してうまく機能します!

56
Alex Martelli
def xstr(s):
   return s or ""
14
def xstr(s):
    return {None:''}.get(s, s)
7
tobidope

機能的な方法(ワンライナー)

xstr = lambda s: '' if s is None else s
7
Dario

私は最大関数を使用します:

max(None, '')  #Returns blank
max("Hello",'') #Returns Hello

チャームのように機能します;)文字列を関数の最初のパラメーターに入れるだけです。

4
radtek

他の回答のいくつかでこの構築を行うためのきちんとしたワンライナー:

s = (lambda v: v or '')(a) + (lambda v: v or '')(b)

または単に:

s = (a or '') + (b or '')
4

Python 2.4との互換性が必要な場合は上記のバリエーション

xstr = lambda s: s is not None and s or ''
4
Peter Ericson

以下で説明するシナリオでは、型キャストを常に回避できます。

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))
1
phillc

文字列のフォーマットのみに関する場合は、次のことができます。

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)
1
maciek

短絡評価を使用します。

s = a or '' + b or ''

+は文字列に対して非常に適切な操作ではないため、フォーマット文字列をより適切に使用します。

s = "%s%s" % (a or '', b or '')
0
sharjeel