Pythonには空の文字列変数のようなものがありますか。
if myString == string.empty:
とにかく、空の文字列値をチェックするための最もエレガントな方法は何ですか?私は空の文字列をチェックするために""
を毎回ハードコーディングするのはそれほど良くないと思います。
「PEP 8 」から、 「プログラミングの推奨事項」のセクション :
シーケンス(文字列、リスト、タプル)の場合、空のシーケンスは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 OR Empty OR 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でないかどうかをテストするのとは正反対です[Empty NOR 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())
私はかつて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
これを行う唯一の本当に確実な方法は次のとおりです。
if "".__eq__(myString):
他のすべてのソリューションには、考えられる問題と、チェックが失敗する可能性のあるEdgeのケースがあります。
myString
がstr
を継承し、len(myString)==0
メソッドをオーバーライドするクラスのオブジェクトである場合、__len__()
は失敗する可能性があります。
同様に、myString
がmyString.__eq__("")
および__eq__()
をオーバーライドすると、myString == ""
および__ne__()
は失敗する可能性があります。
何らかの理由で、myString
が__eq__()
をオーバーライドすると、"" == myString
もだまされます。
myString is ""
と"" is myString
は同等です。 myString
が実際には文字列ではなく、文字列のサブクラスである場合、両方とも失敗します(両方ともFalse
を返します)。また、これらはIDチェックであるため、Pythonがストリングプーリング(ストリングインターンメントとも呼ばれます)を使用するため、唯一の理由は、ストリングがインターンされた場合にストリングの同じインスタンスを使用するためです(こちらを参照:- 「==」または「is」のいずれかを使用して文字列を比較すると、異なる結果が生成されることがあるのはなぜですか? )そして、""
はCPythonの最初からインターンされます
IDチェックの大きな問題は、String Internmentが(私が知る限り)どのストリングがインターン化されるかが標準化されていないことです。つまり、理論的には""
はインターンする必要はなく、実装に依存します。
本当にだまされないこれを行う唯一の方法は、冒頭で述べた"".__eq__(myString)
です。これは空の文字列の__eq__()
メソッドを明示的に呼び出すため、myStringのメソッドをオーバーライドしてもだまされず、str
のサブクラスで確実に動作します。
また、オブジェクトが__bool__()
メソッドをオーバーライドする場合、文字列の偽りに依存することは機能しない可能性があります。
これは理論的な作業であるだけでなく、実際に使用に関連する場合があります。フレームワークとライブラリがstr
をサブクラス化し、myString is ""
をサブクラス化する前に間違った出力を返す可能性があるからです。
また、一般的にis
を使用して文字列を比較することは、文字列プーリングがかなり奇妙な規則に従うため、時には正しく動作するが、時には動作しないため、非常に悪いトラップです。
とはいえ、ほとんどの場合、前述のソリューションはすべて正常に機能します。これは、ほとんどが学術的な仕事です。
空または空白の文字列をテストします(より短い方法)。
if myString.strip():
print("it's not an empty or blank string")
else:
print("it's an empty or blank string")
空文字列とnull文字列を区別したい場合はif len(string)
を使用することをお勧めします。それ以外の場合は、他の人が言っているように単にif string
を使用することをお勧めします。空白でいっぱいの文字列についての警告はまだ適用されます、従ってstrip
を忘れないでください。
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
が議論に加わったことに気づいたので、それを加えてさらに圧縮すると、
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}')
a = ''
b = ' '
a.isspace() -> False
b.isspace() -> True
文字列が空の場合、if stringname:
はfalse
を返します。これ以上簡単にはできないと思います。
空の文字列をチェックするために毎回ハードコーディング( "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
であるべきか)とコード実装(実際に何を比較しているのか)を組み合わせているためです。
懸念の分離 2つの間にある必要があります。
次のどちらか
foo is ''
あるいは
empty = ''
foo is empty
これはどう?おそらくそれは「最もエレガント」ではありませんが、かなり完全で明確なようです。
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
と(spaces)を "空白"の文字列として扱わなければならない場合は、こちらがより良い方法です。
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の要件を満たします。
not str(myString)
この式は、空の文字列に対してはTrueです。空でない文字列、None、および文字列でないオブジェクトはすべてFalseを生成します。オブジェクトが__str__をオーバーライドして偽の値を返すことでこのロジックを妨害する可能性があるという警告があります。
str = ""
if not str:
print "Empty String"
if(len(str)==0):
print "Empty String"
もう1つの簡単な方法は、単純な関数を定義することです。
def isStringEmpty(inputString):
if len(inputString) == 0:
return True
else:
return False
あなただけの場合
not var1
空の文字列''
とブール値False
の変数を区別することは不可能です。
var1 = ''
not var1
> True
var1 = False
not var1
> True
ただし、スクリプトに単純な条件を追加すると、違いが生じます。
var1 = False
not var1 and var1 != ''
> True
var1 = ''
not var1 and var1 != ''
> False
この Pythonでは空の値または文字列を代入する をご覧ください。
これは空の文字列を比較することです。それで、not
で空虚さをテストする代わりに、あなたはあなたの文字列が""
空の文字列で空の文字列と等しいかどうかをテストするかもしれません...
これが誰かに役立つ場合には、ここにリストのリストの中の空白の文字列を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データベースにリストのリストを投稿するのに役立ちます。
apache StringUtils.isBlank またはGuava Strings.isNullOrEmpty のような動作を期待する人のために
if mystring and mystring.strip():
print "not blank string"
else:
print "blank string"
それが文字列であることを確認してその長さをチェックするので、私はこれがエレガントだと思います:
def empty(mystring):
assert isinstance(mystring, str)
if len(mystring) == 0:
return True
else:
return False
ファイルを行単位で読み込んでいて、どの行が空であるかを判断したい場合は、必ず ".strip()
"を使用するようにしてください。 "empty"行には改行文字があるからです。
lines = open("my_file.log", "r").readlines()
for line in lines:
if not line.strip():
continue
# your code for non-empty lines