回答:
空の文字列は「偽」であり、ブールコンテキストではfalseと見なされるため、次のようにすることができます。
if not myString:
これは、変数が文字列であることがわかっている場合に推奨される方法です。変数が他の型になる可能性がある場合は、を使用する必要がありますmyString == ""
。ブール値のコンテキストでfalseとなる他の値については、真理値テストに関するドキュメントを参照してください。
if not myString:
ですmyString
がNone
、も0
、False
などの場合はブロックをます。そのmyString
ため、型がわからない場合は、を使用if myString == "":
して、空の文字列かどうかを判断する必要があります。他の偽の値。
if myString == ...
式の代わりに、if myString in (None, '')
または@Bartekごとに、if myString in (None, '') or not myString.strip()
シーケンス(文字列、リスト、タプル)の場合、空のシーケンスはfalseであるという事実を使用します。
だからあなたは使うべきです:
if not some_string:
または:
if some_string:
明確にするために、シーケンスは次のように評価されますFalse
True
が空であるかどうかにかかわらず、ブールコンテキストまたはブールコンテキストでます。彼らは同じではないのFalse
かTrue
。
x == False
ます。しかし、IMHOは、対象読者を考慮して、説明を歓迎します。
剥ぎ取る前に私は無についてテストしました。また、空の文字列はFalse(またはFalsy)であるという事実を使用します。このアプローチは、ApacheのStringUtils.isBlankまたはGuavaのStrings.isNullOrEmptyに似ています
これは、文字列がNoneまたはEmptyまたはBlankのいずれかであるかどうかをテストするために使用するものです。
def isBlank (myString):
if myString and myString.strip():
#myString is not None AND myString is not empty or blank
return False
#myString is None OR myString is empty or blank
return True
そして、文字列がNone NOR空でないNOR空でないかどうかをテストするのとは正反対です:
def isNotBlank (myString):
if myString and myString.strip():
#myString is not None AND myString is not empty or blank
return True
#myString is None OR myString is empty or blank
return False
上記のコードのより簡潔な形式:
def isBlank (myString):
return not (myString and myString.strip())
def isNotBlank (myString):
return bool(myString and myString.strip())
if mystring and not mystring.strip()
?
string and not string.isspace()
?
def isBlank(s): return not (s and s.strip())
とdef isNotBlank(s): return s and s.strip()
。
私はかつてBartekの答えに似た何かを書き、javascriptが触発されました:
def is_not_blank(s):
return bool(s and s.strip())
テスト:
print is_not_blank("") # False
print is_not_blank(" ") # False
print is_not_blank("ok") # True
print is_not_blank(None) # False
return bool(s.strip())
AttributeError: 'NoneType' object has no attribute 'strip'
これを行う本当に確実な方法は次のとおりです。
if "".__eq__(myString):
他のすべての解決策には、問題が発生する可能性があり、チェックが失敗する可能性のある場合があります。
len(myString)==0
メソッドmyString
を継承しstr
てオーバーライドするクラスのオブジェクトである場合、失敗する可能性があります__len__()
。
同様にmyString == ""
、およびmyString.__eq__("")
をmyString
オーバーライドする__eq__()
と失敗する可能性があり__ne__()
ます。
何らかの理由でオーバーライドした"" == myString
場合もだまされmyString
ます__eq__()
。
myString is ""
と"" is myString
同等です。myString
が実際には文字列ではなく文字列のサブクラスである場合、どちらも失敗します(どちらもが返されますFalse
)。彼らは身元確認、彼らの仕事は、Pythonは、それがインターンされている場合、文字列の同じインスタンスを使用しています(また、文字列抑留呼ばれる)文字列プールを使用しているので、唯一の理由であることからも、(ここを参照してください:なぜはどちらか使用して文字列を比較するん「= = 'または' is 'は異なる結果を生成することがありますか?)。そして""
CPythonで最初からインターンされています
アイデンティティチェックの大きな問題は、文字列インターンメントが(私が知る限り)インターンされている文字列が標準化されていないことです。つまり、理論的には""
はインターンする必要はなく実装に依存します。
これを実際にだますことができない唯一の方法は、冒頭で述べた方法です"".__eq__(myString)
。これは明示的に__eq__()
空の文字列のメソッドを呼び出すので、myStringのメソッドをオーバーライドしてだまされてはならず、以下のサブクラスで確実に機能しますstr
ます。
また、オブジェクトがそれをオーバーライドする場合、文字列の偽りに依存しても機能しない可能性があります。 __bool__()
メソッドを。
これは理論的な作業であるだけでなく、実際に使用するstr
前にサブクラス化されたフレームワークとライブラリを見たので、実際の使用に実際に関連している可能性がありますmyString is ""
可能性があります。すると間違った出力が返される可能性があるためです。
また、使用して文字列を比較する is
文字列のプールはかなり奇妙な規則に従っているため、一般的にしてことは、時には正しく機能しますが、他の場合には機能しないため、かなり邪悪なトラップです。
とはいえ、ほとんどの場合、前述のソリューションはすべて正しく機能します。これは主に学術的な仕事です。
空の文字列とnull文字列を区別したい場合は、を使用することをお勧めしますif len(string)
。それ以外の場合は、if string
他の人が言ったように単純に使用することをお勧めします。ただし、空白でいっぱいの文字列に関する警告は依然として当てはまるので、を忘れないでくださいstrip
。
a = ''
b = ' '
a.isspace() -> False
b.isspace() -> True
a='a'
場合、は取得されますがa.isspace() -> False
、a
そのアカウントでは空の文字列にはなりません。
空の文字列をチェックするために毎回hardcoding(sic) ""を見つけるのは良くありません。
これを行うことfoo == ""
は非常に悪い習慣です。""
魔法の値です。魔法の値(より一般的には魔法の数として知られている)に対してチェックするべきではありません。)を
あなたがすべきことは、説明的な変数名と比較することです。
「empty_string」は説明的な変数名であると考えるかもしれません。そうではない。
行く前に empty_string = ""
、比較する優れた変数名があると思います。これは、「説明的な変数名」が意味するものではありません。
わかりやすい変数名は、そのコンテキストに基づいています。空の文字列が何であるかを考える必要があります。
ユーザーが値を入力できるフォームを作成しています。ユーザーが何かを書いたかどうかを確認したいとします。
良い変数名は not_filled_in
これにより、コードが非常に読みやすくなります
if formfields.name == not_filled_in:
raise ValueError("We need your name")
CSVファイルを解析していて、空の文字列を次のように解析したい None
(CSVは完全にテキストベースであるため、表現できません None
定義済みのキーワードを使用し)
良い変数名は CSV_NONE
これにより、None
別の文字列で表す新しいCSVファイルがある場合に、コードを簡単に変更および適応できます。""
if csvfield == CSV_NONE:
csvfield = None
このコードが正しいかどうかについての質問はありません。それがやるべきことをするのは明らかです。
これと比較して
if csvfield == EMPTY_STRING:
csvfield = None
ここで最初の質問は、「空の文字列はなぜ特別な扱いに値するのですか?」です。
これは、空の文字列は常にと見なされるべきであることを将来のコーダーに伝えますNone
。
これは、ビジネスロジック(CSV値とは何かNone
)とコード実装(実際の比較対象)が混在しているためです。
""
同じ魔法値、ではないTrue
、False
またはNone
魔法の値ではありません。
これはどう?おそらく「最もエレガント」ではないかもしれませんが、かなり完全で明確に見えます。
if (s is None) or (str(s).strip()==""): // STRING s IS "EMPTY"...
@ 1290に返信。コメントのブロックをフォーマットする方法はありません。None
値は、Pythonに空の文字列ではなく、いずれも(スペース)です。Andrew Clarkからの答えは正しいものですif not myString
。@roubleからの回答はアプリケーション固有であり、OPの質問には回答しません。「空」の文字列の固有の定義を採用すると、問題が発生します。具体的には、標準的な動作はつまりstr(None)
生産します'None'
空白以外の文字列ます。
ただし、None
and(スペース)を「空白」の文字列として扱う必要がある場合は、次の方法が適しています。
class weirdstr(str):
def __new__(cls, content):
return str.__new__(cls, content if content is not None else '')
def __nonzero__(self):
return bool(self.strip())
例:
>>> normal = weirdstr('word')
>>> print normal, bool(normal)
word True
>>> spaces = weirdstr(' ')
>>> print spaces, bool(spaces)
False
>>> blank = weirdstr('')
>>> print blank, bool(blank)
False
>>> none = weirdstr(None)
>>> print none, bool(none)
False
>>> if not spaces:
... print 'This is a so-called blank string'
...
This is a so-called blank string
bool
文字列の予想される動作を損なうことなく、@ rouble要件を満たします。
python -c "if (str(None) == 'None'): print ('OMG, WHY ??')"
文字列であることを確認し、その長さをチェックするので、これはエレガントだと思います。
def empty(mystring):
assert isinstance(mystring, str)
if len(mystring) == 0:
return True
else:
return False
-O
フラグを移動したり、PYTHONOPTIMIZE
env変数を設定したりすると最適化されます。
あなたはPythonでこの空の値または文字列の割り当てを見るかもしれません
これは空の文字列を比較することです。したがって、で空not
かどうかをテストする代わりに、あなたの文字列が空の文字列で空の文字列と等しいかどうかをテストすることができ""
ます...
Apache StringUtils.isBlankやGuava Strings.isNullOrEmptyのような動作を期待する人のために:
if mystring and mystring.strip():
print "not blank string"
else:
print "blank string"
これが誰かに役立つ場合は、リストのリストで空の文字列をN / Aに置き換えるために作成した簡単な関数を次に示します(python 2)。
y = [["1","2",""],["1","4",""]]
def replace_blank_strings_in_lists_of_lists(list_of_lists):
new_list = []
for one_list in list_of_lists:
new_one_list = []
for element in one_list:
if element:
new_one_list.append(element)
else:
new_one_list.append("N/A")
new_list.append(new_one_list)
return new_list
x= replace_blank_strings_in_lists_of_lists(y)
print x
これは、特定のフィールド(スキーマではNNとマークされているフィールドです。私の場合、これは複合主キーが原因でした)の空白を受け入れないmysqlデータベースにリストのリストを投稿するのに役立ちます。
上記のprmattaと同じですが、間違いです。
def isNoneOrEmptyOrBlankString (myString):
if myString:
if not myString.strip():
return True
else:
return False
return False
""
と" "
ためとFalse "a"
(同じように期待)。あなたのコードは同じことを返しますが、空の文字列はTrueを返しますが、それはすべきではありません。
""
良くないのですか?