1852

Pythonには、次のような空の文字列変数のようなものがありますか?

if myString == string.empty:

とにかく、空の文字列値をチェックする最もエレガントな方法は何ですか?""空の文字列をチェックするたびにハードコーディングがうまくいかないことがわかります。

4

23 に答える 23

2705

空の文字列は「偽」( python 2またはpython 3リファレンス) です。つまり、ブール値のコンテキストでは false と見なされるため、次のようにすることができます。

if not myString:

これは、変数が文字列であることがわかっている場合に推奨される方法です。変数が他の型である可能性がある場合は、 を使用する必要がありますmyString == ""。ブール値のコンテキストで false となるその他の値については、 Truth Value Testingに関するドキュメントを参照してください。

于 2012-03-05T20:10:21.147 に答える
489

PEP 8「プログラミングの推奨事項」セクションから:

シーケンス (文字列、リスト、タプル) の場合、空のシーケンスは false であるという事実を使用します。

したがって、次を使用する必要があります。

if not some_string:

また:

if some_string:

明確にするために、シーケンスが空であるかどうかにかかわらず、ブール値のコンテキストで、またはその中で評価されます。それらはまたはと等しくありませんFalseTrueFalseTrue

于 2012-03-05T20:12:19.540 に答える
305

最もエレガントな方法は、おそらく真か偽かを単純にチェックすることです。

if not my_string:

ただし、次の理由で空白を削除したい場合があります。

 >>> bool("")
 False
 >>> bool("   ")
 True
 >>> bool("   ".strip())
 False

ただし、この文字列が何らかの検証に合格し、この方法でテストできる文字列であることが確実にわかっていない限り、おそらくもう少し明示的にする必要があります。

于 2012-03-05T20:11:54.427 に答える
111

ストリッピングする前に、非存在性をテストします。また、空の文字列は 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())
于 2014-07-02T14:44:02.360 に答える
50

これを行う唯一の確実な方法は次のとおりです。

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ことは、正しく機能する場合もありますが、正しく機能しない場合もあるため、かなり悪いトラップです。

とはいえ、ほとんどの場合、前述のソリューションはすべて正しく機能します。この投稿は主に学術的な作業です。

于 2019-04-18T13:46:48.583 に答える
10

空文字列と null 文字列を区別したい場合はif len(string)、を使用することをお勧めします。それ以外の場合は、他の人が言ったように単純に使用することをお勧めしif stringます。ただし、空白でいっぱいの文字列に関する警告は引き続き適用されるため、strip.

于 2012-03-05T20:20:05.283 に答える
9

if stringname:false文字列が空の場合は aを返します。これ以上簡単なことはないと思います。

于 2012-03-05T20:15:59.027 に答える
8

空の文字列をチェックするたびにハードコーディング(原文のまま) "" がうまくいかないことがわかりました。

クリーンコードアプローチ

これを行う:foo == ""非常に悪い習慣です。""魔法の値です。魔法の値 (より一般的には魔法の数字として知られている)に対してチェックしないでください。

あなたがすべきことは、説明的な変数名と比較することです。

わかりやすい変数名

「empty_string」は説明的な変数名だと思うかもしれません。そうではありません

empty_string = ""行って実行して、比較するのに最適な変数名があると考える前に。これは、「記述変数名」が意味するものではありません。

わかりやすい変数名は、そのコンテキストに基づいています。空文字列とは何かを考える必要があります。

  • それはどこから来たのですか。
  • なぜそこにあるのですか。
  • なぜ確認する必要があるのでしょうか。

簡単なフォーム フィールドの例

ユーザーが値を入力できるフォームを作成しています。ユーザーが何かを書いたかどうかを確認したい。

適切な変数名はnot_filled_in

これにより、コードが非常に読みやすくなります

if formfields.name == not_filled_in:
    raise ValueError("We need your name")

完全な CSV 解析の例

CSV ファイルを解析していて、空の文字列を次のように解析したいNone

None(CSVは完全にテキストベースのため、事前定義されたキーワードを使用しないと表現できません)

適切な変数名はCSV_NONE

Noneこれにより、別の文字列で表す新しい CSV ファイルがある場合に、コードの変更と適応が容易になります。""

if csvfield == CSV_NONE:
    csvfield = None

このコードが正しいかどうかについては疑問の余地はありません。それがすべきことをすることはかなり明らかです。

これと比較して

if csvfield == EMPTY_STRING:
    csvfield = None

ここでの最初の質問は、なぜ空の文字列が特別な扱いを受けるに値するのかということです。

これは、将来のコーダーに、空の文字列は常にNone.

これは、ビジネス ロジック (CSV の値はどうあるべきかNone) とコードの実装 (実際に比較しているもの) が混在しているためです。

この 2 つの間の懸念事項を分離する必要があります。

于 2016-10-04T07:35:46.977 に答える
5
a = ''
b = '   '
a.isspace() -> False
b.isspace() -> True
于 2013-08-07T15:55:54.493 に答える
1

.strip()ファイルを行ごとに読み取っていて、どの行が空であるかを判断したい場合は、「空の」行に改行文字があるため、必ず を使用してください。

lines = open("my_file.log", "r").readlines()

for line in lines:
    if not line.strip():
        continue

    # your code for non-empty lines
于 2016-03-06T14:16:31.973 に答える
0

このAssigning empty value or string in Pythonを見ているかもしれません

これは、空の文字列を比較することです。したがって、 で空でnotあることをテストする代わりに、文字列が空の文字列と等しいかどうかをテストでき""ます...

于 2014-02-24T06:49:49.980 に答える
0

Apache StringUtils.isBlankまたは Guava Strings.isNullOrEmptyのような動作を期待する人向け:

if mystring and mystring.strip():
    print "not blank string"
else:
    print "blank string"
于 2015-02-10T13:48:33.977 に答える