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
ในบริบทแบบบูลหากพวกเขาเป็นที่ว่างเปล่าหรือไม่ พวกเขาจะไม่เท่ากันไปหรือFalse
True
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 สิ่งที่ไม่ควร
""
ไม่ดี?