Python มีลักษณะเหมือนตัวแปรสตริงว่างเปล่าหรือไม่ซึ่งคุณสามารถทำได้:
if myString == string.empty:
วิธีที่ดีที่สุดในการตรวจสอบค่าสตริงที่ว่างเปล่าคืออะไร ฉันพบการเข้ารหัสยาก""ทุกครั้งที่ตรวจสอบสตริงว่างเปล่าไม่ดี
Python มีลักษณะเหมือนตัวแปรสตริงว่างเปล่าหรือไม่ซึ่งคุณสามารถทำได้:
if myString == string.empty:
วิธีที่ดีที่สุดในการตรวจสอบค่าสตริงที่ว่างเปล่าคืออะไร ฉันพบการเข้ารหัสยาก""ทุกครั้งที่ตรวจสอบสตริงว่างเปล่าไม่ดี
คำตอบ:
สตริงว่างคือ"เท็จ"ซึ่งหมายความว่าพวกเขาถือว่าเป็นเท็จในบริบทบูลีนดังนั้นคุณสามารถทำได้ดังนี้
if not myString:
นี่เป็นวิธีที่ต้องการหากคุณรู้ว่าตัวแปรของคุณเป็นสตริง หากตัวแปรของคุณยังอาจเป็นบางประเภทอื่น ๆ myString == ""แล้วคุณควรใช้ ดูเอกสารประกอบเกี่ยวกับการทดสอบค่าความจริงสำหรับค่าอื่น ๆ ที่เป็นเท็จในบริบทบูลีน
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()
จากPEP 8ในส่วน"การแนะนำการเขียนโปรแกรม" :
สำหรับซีเควนซ์ (สตริง, รายการ, สิ่งอันดับ) ให้ใช้ความจริงที่ว่าลำดับที่ว่างเปล่าเป็นเท็จ
ดังนั้นคุณควรใช้:
if not some_string:
หรือ:
if some_string:
เพียงชี้แจงลำดับมีการประเมินผลการFalseหรือTrueในบริบทแบบบูลหากพวกเขาเป็นที่ว่างเปล่าหรือไม่ พวกเขาจะไม่เท่ากันไปหรือFalseTrue
x == Falseแล้วหมายความว่ามากกว่าความหมาย แต่ IMHO การชี้แจงยังคงได้รับการต้อนรับจากกลุ่มเป้าหมาย
วิธีที่สง่างามที่สุดอาจเป็นเพียงการตรวจสอบว่าจริงหรือเท็จเช่น:
if not my_string:
อย่างไรก็ตามคุณอาจต้องการตัดพื้นที่สีขาวเนื่องจาก:
>>> bool("")
False
>>> bool(" ")
True
>>> bool(" ".strip())
False
คุณควรจะชัดเจนมากขึ้นในเรื่องนี้อย่างไรก็ตามถ้าคุณไม่แน่ใจว่าสายนี้ได้ผ่านการตรวจสอบบางชนิดและเป็นสตริงที่สามารถทดสอบด้วยวิธีนี้
ฉันจะทดสอบความไม่ลงรอยกันก่อนลอก นอกจากนี้ฉันจะใช้ความจริงที่ว่าสตริงว่างเปล่าเป็นเท็จ (หรือเท็จ) วิธีนี้คล้ายกับStringUtils.isBlank ของ ApacheหรือStrings.isNullOrEmpty ของ Guava
นี่คือสิ่งที่ฉันจะใช้เพื่อทดสอบว่าสตริงเป็น 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 เปล่า:
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 และจาวาสคริปต์เป็นแรงบันดาลใจ:
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ไม่จริงสตริง แต่ subclass ของสตริง (ทั้งสองจะกลับมาFalse) นอกจากนี้เนื่องจากเป็นการตรวจสอบข้อมูลเฉพาะตัวเหตุผลเดียวที่ทำงานได้เพราะ Python ใช้ String Pooling (หรือที่เรียกว่า String Internment) ซึ่งใช้อินสแตนซ์เดียวกันของสตริงหากมีการฝึกงาน (ดูที่นี่: ทำไมเปรียบเทียบสตริงโดยใช้ '= = 'หรือ' คือ 'บางครั้งให้ผลลัพธ์ที่แตกต่าง? ) และ""ถูกฝึกงานตั้งแต่เริ่มต้นใน CPython
ปัญหาใหญ่กับการตรวจสอบตัวตนคือ 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")
หากคุณต้องการแยกความแตกต่างระหว่างสตริงว่างและว่างฉันจะแนะนำให้ใช้if len(string)มิฉะนั้นฉันขอแนะนำให้ใช้อย่างif stringที่คนอื่นพูด stripข้อแม้เกี่ยวกับสายเต็มรูปแบบของช่องว่างยังคงใช้แม้ว่าดังนั้นอย่าลืมที่จะ
if stringname:ให้falseเมื่อสตริงว่างเปล่า ฉันคิดว่าคงไม่ง่ายไปกว่านี้อีกแล้ว
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
สิ่งนี้ทำให้โค้ดสามารถเปลี่ยนแปลงและปรับเปลี่ยนได้ง่ายหากคุณมีไฟล์ CSV ใหม่ที่แทนNoneด้วยสตริงอื่นที่ไม่ใช่""
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ค่าไม่ได้เป็นสตริงที่ว่างเปล่าในหลามและไม่เป็น (ช่องว่าง) คำตอบจาก Andrew Clark เป็นคำตอบที่ถูกต้อง: if not myString. คำตอบจาก @rouble เป็นแอปพลิเคชันเฉพาะและไม่ตอบคำถามของ 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
ตรงตามข้อกำหนด @rouble ในขณะที่ไม่ทำลายboolพฤติกรรมที่คาดหวังของสตริง
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
อีกวิธีง่าย ๆ คือการกำหนดฟังก์ชั่นง่าย ๆ :
def isStringEmpty(inputString):
if len(inputString) == 0:
return True
else:
return False
not str(myString)
นิพจน์นี้เป็น True สำหรับสตริงที่ว่างเปล่า สตริงที่ไม่ว่างเปล่าวัตถุที่ไม่ใช่และไม่ใช่สตริงจะสร้างเท็จทั้งหมดโดยมีข้อแม้ที่วัตถุอาจแทนที่ __str__ เพื่อขัดขวางตรรกะนี้โดยส่งคืนค่าเท็จ
คุณอาจดูที่การกำหนดค่าหรือสตริงว่างใน Python
นี่คือการเปรียบเทียบสตริงที่ว่างเปล่า ดังนั้นแทนที่จะทดสอบความว่างเปล่าด้วยnotคุณอาจทดสอบว่าสตริงของคุณเท่ากับสตริงว่างกับ""สตริงว่าง ...
สำหรับผู้ที่คาดหวังพฤติกรรมเช่น apache StringUtils.isBlankหรือ Guava Strings.isNullOrEmpty :
if mystring and mystring.strip():
print "not blank string"
else:
print "blank string"
เมื่อคุณอ่านไฟล์ตามบรรทัดและต้องการพิจารณาว่าบรรทัดใดว่างให้ตรวจสอบว่าคุณจะใช้.strip()เนื่องจากมีอักขระบรรทัดใหม่ในบรรทัด "empty":
lines = open("my_file.log", "r").readlines()
for line in lines:
if not line.strip():
continue
# your code for non-empty lines
str = ""
if not str:
print "Empty String"
if(len(str)==0):
print "Empty String"
หากคุณเพิ่งใช้
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
ในกรณีที่มีประโยชน์กับใครบางคนนี่คือฟังก์ชั่นอย่างรวดเร็วที่ฉันสร้างขึ้นเพื่อแทนที่สตริงว่างด้วย N / A ในรายการของรายการ (หลาม 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
สิ่งนี้มีประโยชน์สำหรับการโพสต์รายการของรายการไปยังฐานข้อมูล mysql ที่ไม่ยอมรับช่องว่างสำหรับบางฟิลด์ (ฟิลด์ที่ทำเครื่องหมายเป็น NN ในสคีมาในกรณีของฉันนี่เป็นเพราะคีย์หลักคอมโพสิต)
ฉันทำการทดลองกับสตริงเช่น '', '', '\ n' เป็นต้นฉันต้องการ isNotWhitespace ให้เป็น True ถ้าตัวแปร foo เป็นสตริงที่มีอักขระที่ไม่ใช่ช่องว่างอย่างน้อยหนึ่งตัว ฉันใช้ Python 3.6 นี่คือสิ่งที่ฉันลงเอยด้วย:
isWhitespace = str is type(foo) and not foo.strip()
isNotWhitespace = str is type(foo) and not not foo.strip()
ล้อมสิ่งนี้ไว้ในนิยามเมธอดหากต้องการ
ในฐานะที่เป็น prmatta โพสต์ข้างต้น แต่มีข้อผิดพลาด
def isNoneOrEmptyOrBlankString (myString):
if myString:
if not myString.strip():
return True
else:
return False
return False
""และ" "และเท็จ"a"(เช่นเดียวกับที่คาดว่า) โค้ดของคุณจะส่งกลับค่าเดิมยกเว้นสตริงที่ว่างเปล่าจะส่งคืนค่า True สิ่งที่ไม่ควร
""ไม่ดี?