not - python 空 行 判断




Pythonで文字列が空であるかどうかを調べる最もエレガントな方法は? (15)

空の文字列をチェックするために毎回ハードコーディングする ""ことがわかりました。

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

これを行う: foo == ""は非常に悪い習慣です。 ""は魔法のような値です。 あなたは魔法の値(より一般的には魔法の数字として知られています

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

記述的な変数名

"empty_string"は記述的な変数名であると考えるかもしれません。 そうではありません

あなたが行く前にempty_string = ""を実行して、比較する大きな変数名があると思います。 これは、「記述変数名」が意味するものではありません。

適切な記述変数名はそのコンテキストに基づいています。 空の文字列何であるか考える必要があります。

  • それはどこから来たのですか。
  • それはなぜそこにあるのですか?
  • なぜあなたはそれをチェックする必要がありますか?

シンプルなフォームフィールドの例

ユーザーが値を入力できるフォームを作成しています。 ユーザーが何かを書いたかどうかをチェックしたいと思う。

良い変数名はnot_filled_in

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

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

徹底したCSV解析の例

CSVファイルを解析していて空の文字列を「 Noneとして解析したい

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

良い変数名はCSV_NONE

これにより、 ""以外の文字列でNoneを表す新しいCSVファイルを作成すると、コードを簡単に変更して変更することができます

if csvfield == CSV_NONE:
    csvfield = None

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

これと比較する

if csvfield == EMPTY_STRING:
    csvfield = None

最初の質問は、空の文字列が特別な扱いを受けるのはなぜですか?

これは、空の文字列が常にNoneとみなされるべきであることを、将来のコーダーに伝えます。

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

両者の間には懸念がある。

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

if myString == string.empty:

空の文字列値をチェックする最もエレガントな方法は何ですか? 空の文字列をチェックするたびにハードコーディングを見つけるのが良いでしょう。 "


@ 1290に応答します。 申し訳ありませんが、コメントのブロックをフォーマットする方法はありません。 None値はPythonでは空文字列ではなく、どちらも空白文字列ではありません。 Andrew Clarkの答えは正しいです: if not myString 。 @ troubleの回答はアプリケーション固有でOPの質問には答えません。 あなたは何が「空白」な文字列であるかの独特の定義を採用すれば、困ったことになります。 特に、標準的な振る舞いは、 str(None)が空でない文字列である'None'生成することです。

しかし、 Noneと(スペース)を空の文字列として扱う必要がある場合は、ここでより良い方法です:

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動作を壊さずに、@ troubleの要件を満たします。


PEP 8「プログラミングに関する推奨事項」セクション

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

だからあなたが使用する必要があります:

if not some_string:

または:

if some_string:

明確にするために、シーケンスが空であるか否かにかかわらず、ブール・コンテキストでFalseまたはTrue評価されます。 彼らはFalseまたはTrue と等しくありません


if stringname:文字列が空のときにfalse if stringname:ます。 私はそれがこれより簡単ではないと思う。


あなたはこれを見るかもしれません空の値や文字列をPythonで割り当てる

これは、空の文字列を比較することです。 だから、空でnotかどうかをテストするのではnot 、あなたの文字列が空の文字列と等しいかどうかテストすることができます。


これはどう? 多分それは "最もエレガントな"ものではありませんが、それはかなり完全で明確です。

if (s is None) or (str(s).strip()==""): // STRING s IS "EMPTY"...

最もエレガントな方法は、おそらく単に真実か偽であるかどうかを確認することです。

if not my_string:

ただし、次の理由により空白を削除することができます。

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

しかし、この文字列が何らかのバリデーションをパスしたことを知っていない限り、このようにテストすることができる文字列であることがわかっている場合を除き、おそらくこれはもう少し明白なはずです。


次のいずれか

foo is ''

あるいは

empty = ''
foo is empty

私はかつてBartekの答えに似たものを書いていました。

def isNotEmpty(s):
    return bool(s and s.strip())

テスト:

print isNotEmpty("")    # False
print isNotEmpty("   ") # False
print isNotEmpty("ok")  # True
print isNotEmpty(None)  # False

私は剥ぎ取る前に、不自然さをテストするでしょう。 また、空の文字列がFalse(またはFalse)であるという事実を使用します。 このアプローチは、 ApacheのStringUtils.isBlankまたはGuavaのStrings.isNullOrEmptyと似ています。

これは、文字列が「なし」または「空白」または「空白」のいずれかであるかどうかをテストするために使用するものです。

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

そして、文字列がない場合のテストとは正反対です。NOR 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 len(string)を使用することをお勧めしif len(string) 。そうでなければ、単に他の人が言ったif stringを使用することをお勧めします。 文字列についての警告は空白でいっぱいですが、 stripことを忘れないでください。


空文字列は"falsy" 。つまり、ブール値のコンテキストではfalseとみなされるため、これを行うことができます。

if not myString:

変数が文字列であることがわかっている場合は、これが好ましい方法です。 あなたの変数が他の型でもよい場合は、 myString == ""使うべきです。 真理値のテストでは、ブール値の文脈では偽である他の値については、ドキュメントを参照してください。


a = ''
b = '   '
a.isspace() -> False
b.isspace() -> True

if my_string is '':

私は答えのどれかにその特定の組み合わせが気づかなかった。 私は検索した

is ''

投稿前の回答で

 if my_string is '': print ('My string is EMPTY') # **footnote

私はこれが元のポスターが手に入れようとしていたものだと思っています。

if my_string is '':
    print('My string is EMPTY')
else:
    print(f'My string is {my_string}')

文字のための文字私はこの解決策が良いと思います。

私はNoneも議論に入っていNoneと指摘しました。

if my_string is '': print('My string is Empty')
elif my_string is None : print('My string.... isn\'t')
else: print(f'My string is {my_string}')

str = ""
if not str:
   print "Empty String"
if(len(str)==0):
   print "Empty String"




comparison-operators