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


156

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

def xstr(s):
    if s is None:
        return ''
    else:
        return s

s = xstr(a) + xstr(b)

更新: str(s)を使用するようにTryptichの提案を組み込んでいます。これにより、このルーチンは文字列以外のタイプでも機能します。私はVinay Sajipのラムダの提案にひどく感銘を受けましたが、コードを比較的単純に保ちたいと思っています。

def xstr(s):
    if s is None:
        return ''
    else:
        return str(s)

7
元の構文が好きです。私はそれはすでにかなり明確で読みやすいと思います。
GuiSim 09年

1
@GuiSim:私は偏見があるかもしれませんが、私の答えはほぼ通常の英語の文のように読みます...
SilentGhost

1
「sがNoneの場合、空の文字列を返します。それ以外の場合、[string of] sを返します。」質問のコードも通常の英文のように読みます。

a)文字列sが、キーが見つからなかったdictルックアップから来た場合は、dict.get(key, '')
smci

b)この文字列変換のみを出力フォーマット(例:印刷)にしたい場合は、 '... {}'。format(dict.get(1)) `を直接実行できます
smci

回答:


94

実際に関数をstr()組み込みのように動作させたいが、引数がNoneのときに空の文字列を返す場合は、次のようにします。

def xstr(s):
    if s is None:
        return ''
    return str(s)

elseを保持していますが、複数のタイプを処理できるようにstr(s)のヒントに感謝します。いいね!
マークハリソン

11
あるいは単にxstr = lambda s: '' if s is None else str(s)
マイケル・

2
if not s:代わりにタイピングが好きですif s is None
guneysus

6
@guneysus彼らは同じではありません:not False == TrueしかしFalse is None == False
リン

ありがとう@Lynnあなたは正しい。私は自分のせいだと気づきました。しかし、私はs常にstr / unicodeタイプまたはを知っています(または想定しています)None。はい、それFalseは価値ですが、キーボードと目を節約するこの方法を好みます;)
guneysus

143
def xstr(s):
    return '' if s is None else str(s)

3
この構文は2.5で導入されました。以前のバージョンのPythonでは、を使用できますreturn s is not None and s or ''
Ben Blank

8
私はより多くのコメンのケースを強調するためにそれを振り返ります:sがNone Noneでない場合はsを返します ""
Ber

5
@バー:二重否定を避けるために、私はそれをそのままにします。
Nikhil Chelliah 2009年

8
これは、どのように.. and .. or ..失敗するか、if-elseが推奨される理由の良い例です。には2つの微妙なバグがありますs is not None and s or ''

1
return '' if not s else str(s)
Iqbal 2016年

107

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

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


1
これは素晴らしいです、ありがとう!orこの方法を使用することを考えたことはありません
user25064 2014

15
sが0、False、または偽の値の場合、これは機能しません
wisbucky

4
まあ、それはopの要件では言及されていないので、ここではあなたの要点はわかりません。
dorvak

2
@dorvak OPは、出力が''iffでなければならないという要件について非常に明確s is Noneです。他のすべての入力はs(またはstr(s)改訂されたリクエストで)返されます。
StvnW 2015年

2
@fortea:動作しません。場合sNone、結果はxstr()空の文字列でなければなりませんが、str(None)文字列与え"None"た文字列があるため返されるものである、("None"falsy値ではありません。
dreamlax

97

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

1
これまでで最もpythonic。PythonがNone、空のリスト、空の文字列、0などをfalseとして扱うという事実を使用します。orステートメントがtrueである最初の要素、またはor(またはorsのグループ)に指定された最後の要素を返すという事実も使用します。また、これはラムダ関数を使用します。私はあなたに+10を与えますが、明らかにそれは私をさせません。
マット

11
これにより、0とFalse(およびbool()に渡されたときにFalseと評価されるその他すべて)が変換されます
Arkady

9
私はそれが「これまでで最もpythonic」であるとは思わない。これは他の言語で一般的なイディオムです。Pythonで使用するのは間違っているとは思いませんが、このようなトリックを回避するために条件式を導入しています。
Roberto Bonvallet、2009年

2
このことができる[]{}等と同じ結果が得られNone、所望されません。 xstr(False)特に、の"False"代わりにすべきです""。ラムダを乱用すると悪い例にdef xstr(s): return s or ""なります。すべてを1行にまとめたいirを使用してください。

5
私が最初に答えを「値が常に文字列またはなしのいずれかであることがわかっている場合」で修飾したことに注意してください。
Vinay Sajip、2010

59

return s or '' あなたの述べられた問題のためにうまくいくでしょう!


4
フォートワース、これが(元の文字列の質問されていないが、更新1。)■がFalseまたは0ときに異なる結果を与えることに注意
Oddthinking

@奇妙なこと、s = Falseまたはs = 0その使用においてエッジケースである可能性が最も高く、次のように書くことで簡単に軽減できますreturn str(s or '')
Willem van Ketwich

@WillemvanKetwich:まったく同じ問題があります:s(False)は ''ではなく 'False'を返す必要があります。s(0)は ''ではなく '0'を返す必要があります。同様に、__ bool__または__nonzero__を定義するオブジェクトの場合。
2017年

@おかしい私はあなたのポイントを参照してください。いずれにせよ、OPの質問のように文字列オブジェクト専用に使用されている場合は問題になりません。
Willem van Ketwich、

@WillemvanKetwich:更新された質問と私のコメントの警告を
ご覧ください


8

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

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

1
"def xstr(s):return '' if s is None else s" is on-liner、python is
notstrictive as astrict with a

2
それは本当のワンライナーではありません、それはただ一行で書かれていますg
Dario

1
どういう意味でそれは本当のオンラインではないのですか?インタプリタをチェックインしてください-構文エラーではありません。すべての意図と目的にとって、ラムダよりも現実的です^ _ ^
SilentGhost

2
変数にラムダを割り当てる代わりに、defを使用する必要があるPEP 8種。ラムダの唯一の本当の利点は、式の一部として(たとえば、別の関数に渡して)記述できることであり、このようなコードではその利点が失われます。私もdefが1行で記述できることに気づくまでPEP 8が進むべき道を教えてくれるまでこれをしていました。常にpythonの神々に従ってください。
ガイ

8

他のいくつかの答えに基づいてこの構築を行うためのきちんとしたワンライナー:

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

または単に:

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

なぜ言及するの(lambda v: v or '')ですか?
Tvde1

何故なの?1つの価格で2つのヒント!😀
ウィレムバンKetwich

1
False空のリストも ''に変わることに注意してください。
Nik O'Lai

同じのため0など、
ウォルターTross

6
def xstr(s):
    return {None:''}.get(s, s)

私はそれはかなりpythonicだと思います-これはどうですか: "xstr = lambda s:{None: ''}。get(s、s)"-全体を1行に減らします。
Juergen、

14
不必要に遅く(余分な辞書の作成と検索)、読みにくい。かなり非Pythonic。
トリプティク

あなたが正しい。かなり洗練されていますが、Pythonバイトコードでの条件付きジャンプを回避します。
tobidope 2009年

4
get()関数呼び出しは、少なくとも1つの追加の条件付きジャンプを意味します。
トリプティク

1
質問を知らない、または見上げることなくして、これが何をすべきかを言うことはできませんget
ダリオ

5

私はmax関数を使用します:

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

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


5
これは 'str'> 'NoneType'で機能し、CPython固有です。マニュアル:「数字を除いて、異なる種類のオブジェクトは型の名前で順番付けされています」。また、これはPython 3000では機能しません。タイプ間の比較が許可されなくなったためです(TypeError:unorderable types:str()> NoneType())。Pythonはstringとint
2014年

知っておくと良いので、Python 3.x互換コードを前進させるのは良い考えではありません。
radtek、2014


2

文字列のフォーマットに関する場合は、次の操作を実行できます。

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
def xstr(s):
    return s if s else ''

s = "%s%s" % (xstr(a), xstr(b))

5
これはすべての偽のような値に対して空の文字列を返しますが、これは投稿者が要求したものではありません。
トリプティク

1

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

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からフェッチされている場合や、値を操作するためにさらに型キャストが必要な場合によく見られます。


0

短絡評価を使用します。

s = a or '' + b or ''

+は文字列に対してあまり良い操作ではないため、フォーマット文字列を使用することをお勧めします。

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

2
また、Noneだけでなく、すべてのfalseに似た値について、「a」を空の文字列に変換します。たとえば、空のタプル、リスト、および辞書は、OPが指定したものではない空の文字列に変換されます。
トリプティク

+2つの文字列に最適な演算子です。あなたがそれを使って何十人もの人に参加しようとするとき、あなたは問題を抱えています。2つの場合は、おそらく他のオプションより高速になります。いずれにせよ、それはノイズの中にあります。
kquinn 2009年

私にとって+1は、これがまさに私の場合に必要なものです:単一の演算子(or)を置き換えるラムダまたは関数は、私には少々やり過ぎに思われます... strまたはNoneのような他の偽の値のケースはありません。コメント以外の+特定のシナリオに依存する場合がありますし、ベンチマークが必要な場合があります演算子、この答えはないではない値する-1
都市の

-3

Python v3.7を使用している場合は、F文字列を使用します

xstr = F"{s}"

1
これは誤りであり'None'sisの場合は文字列を返しますNone
ローレンス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.