Pythonには、次のような空の文字列変数のようなものがありますか?
if myString == string.empty:
とにかく、空の文字列値をチェックする最もエレガントな方法は何ですか?""
空の文字列をチェックするたびにハードコーディングがうまくいかないことがわかります。
Pythonには、次のような空の文字列変数のようなものがありますか?
if myString == string.empty:
とにかく、空の文字列値をチェックする最もエレガントな方法は何ですか?""
空の文字列をチェックするたびにハードコーディングがうまくいかないことがわかります。
空の文字列は「偽」( python 2またはpython 3リファレンス) です。つまり、ブール値のコンテキストでは false と見なされるため、次のようにすることができます。
if not myString:
これは、変数が文字列であることがわかっている場合に推奨される方法です。変数が他の型である可能性がある場合は、 を使用する必要がありますmyString == ""
。ブール値のコンテキストで false となるその他の値については、 Truth Value Testingに関するドキュメントを参照してください。
シーケンス (文字列、リスト、タプル) の場合、空のシーケンスは false であるという事実を使用します。
したがって、次を使用する必要があります。
if not some_string:
また:
if some_string:
明確にするために、シーケンスが空であるかどうかにかかわらず、ブール値のコンテキストで、またはその中で評価されます。それらはまたはと等しくありません。False
True
False
True
最もエレガントな方法は、おそらく真か偽かを単純にチェックすることです。
if not my_string:
ただし、次の理由で空白を削除したい場合があります。
>>> bool("")
False
>>> bool(" ")
True
>>> bool(" ".strip())
False
ただし、この文字列が何らかの検証に合格し、この方法でテストできる文字列であることが確実にわかっていない限り、おそらくもう少し明示的にする必要があります。
ストリッピングする前に、非存在性をテストします。また、空の文字列は 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でもEmptyでもBlankでもないかどうかをテストするのとは正反対です:
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 "".__eq__(myString):
他のすべてのソリューションには、可能性のある問題と、チェックが失敗する可能性のあるエッジ ケースがあります。
len(myString)==0
メソッドを継承してオーバーライドmyString
するクラスのオブジェクトである場合、失敗する可能性があります。str
__len__()
同様にmyString == ""
、 andをオーバーライドするとmyString.__eq__("")
失敗する可能性があります。myString
__eq__()
__ne__()
overridesの場合も、何らかの理由"" == myString
でだまされます。myString
__eq__()
myString is ""
と"" is myString
同等です。myString
が実際には文字列ではなく文字列のサブクラスである場合、どちらも失敗します (どちらも を返しFalse
ます)。また、それらは身元チェックであるため、それらが機能する唯一の理由は、Python が文字列プーリング (文字列インターンメントとも呼ばれます) を使用するためです。これは、インターンされている場合に文字列の同じインスタンスを使用します (こちらを参照してください: =' または 'is' は時々異なる結果を生成しますか? )。そして""
、CPythonで最初からインターンされています
ID チェックの大きな問題は、String Internment が (私が見つけた限りでは) どの文字列がインターンされるかが標準化されていないことです。つまり、理論的""
にはインターンする必要はなく、実装に依存します。
だまされない唯一の方法は、最初に述べた方法です"".__eq__(myString)
。これは空の文字列のメソッドを明示的に呼び出すため__eq__()
、myString のメソッドをオーバーライドしてもだまされず、 のサブクラスで確実に動作しstr
ます。
また、オブジェクトがそのメソッドをオーバーライドする場合、文字列の偽りに依存しても機能しない可能性があります__bool__()
。
これは理論的な作業であるだけでなく、実際の使用に実際に関連している可能性があります。str
以前にフレームワークとライブラリをサブクラス化し、使用するとmyString is ""
間違った出力が返される可能性があるためです。
また、文字列プーリングは非常に奇妙なルールに従っているため、一般的に文字列を比較するis
ことは、正しく機能する場合もありますが、正しく機能しない場合もあるため、かなり悪いトラップです。
とはいえ、ほとんどの場合、前述のソリューションはすべて正しく機能します。この投稿は主に学術的な作業です。
空文字列と null 文字列を区別したい場合はif len(string)
、を使用することをお勧めします。それ以外の場合は、他の人が言ったように単純に使用することをお勧めしif string
ます。ただし、空白でいっぱいの文字列に関する警告は引き続き適用されるため、strip
.
if stringname:
false
文字列が空の場合は aを返します。これ以上簡単なことはないと思います。
空の文字列をチェックするたびにハードコーディング(原文のまま) "" がうまくいかないことがわかりました。
これを行う:foo == ""
非常に悪い習慣です。""
魔法の値です。魔法の値 (より一般的には魔法の数字として知られている)に対してチェックしないでください。
あなたがすべきことは、説明的な変数名と比較することです。
「empty_string」は説明的な変数名だと思うかもしれません。そうではありません。
empty_string = ""
行って実行して、比較するのに最適な変数名があると考える前に。これは、「記述変数名」が意味するものではありません。
わかりやすい変数名は、そのコンテキストに基づいています。空文字列とは何かを考える必要があります。
ユーザーが値を入力できるフォームを作成しています。ユーザーが何かを書いたかどうかを確認したい。
適切な変数名はnot_filled_in
これにより、コードが非常に読みやすくなります
if formfields.name == not_filled_in:
raise ValueError("We need your name")
CSV ファイルを解析していて、空の文字列を次のように解析したいNone
None
(CSVは完全にテキストベースのため、事前定義されたキーワードを使用しないと表現できません)
適切な変数名はCSV_NONE
None
これにより、別の文字列で表す新しい CSV ファイルがある場合に、コードの変更と適応が容易になります。""
if csvfield == CSV_NONE:
csvfield = None
このコードが正しいかどうかについては疑問の余地はありません。それがすべきことをすることはかなり明らかです。
これと比較して
if csvfield == EMPTY_STRING:
csvfield = None
ここでの最初の質問は、なぜ空の文字列が特別な扱いを受けるに値するのかということです。
これは、将来のコーダーに、空の文字列は常にNone
.
これは、ビジネス ロジック (CSV の値はどうあるべきかNone
) とコードの実装 (実際に比較しているもの) が混在しているためです。
この 2 つの間の懸念事項を分離する必要があります。
a = ''
b = ' '
a.isspace() -> False
b.isspace() -> True
.strip()
ファイルを行ごとに読み取っていて、どの行が空であるかを判断したい場合は、「空の」行に改行文字があるため、必ず を使用してください。
lines = open("my_file.log", "r").readlines()
for line in lines:
if not line.strip():
continue
# your code for non-empty lines
このAssigning empty value or string in Pythonを見ているかもしれません
これは、空の文字列を比較することです。したがって、 で空でnot
あることをテストする代わりに、文字列が空の文字列と等しいかどうかをテストでき""
ます...
Apache StringUtils.isBlankまたは Guava Strings.isNullOrEmptyのような動作を期待する人向け:
if mystring and mystring.strip():
print "not blank string"
else:
print "blank string"