python - पाइथन में स्ट्रिंग खाली है या नहीं, यह जांचने का सबसे शानदार तरीका है?




string comparison-operators (13)

मुझे एक खाली स्ट्रिंग को जांचने के लिए हर बार हार्डकोडिंग (एसआईसी) "" मिलता है।

स्वच्छ कोड दृष्टिकोण

ऐसा करना: foo == "" बहुत खराब अभ्यास है। "" एक जादुई मूल्य है। आपको जादुई मूल्यों के खिलाफ कभी भी जांच नहीं करनी चाहिए (आमतौर पर जादुई संख्या के रूप में जाना जाता है)

आपको क्या करना चाहिए वर्णनात्मक चर नाम से तुलना करना चाहिए।

वर्णनात्मक चर नाम

कोई सोच सकता है कि "blank_string" एक वर्णनात्मक चर नाम है। यह नहीं है

जाने से पहले और empty_string = "" और सोचें कि आपके पास तुलना करने के लिए एक शानदार चर नाम है। यह "वर्णनात्मक परिवर्तनीय नाम" का अर्थ नहीं है।

एक अच्छा वर्णनात्मक चर नाम इसके संदर्भ पर आधारित है। आपको खाली स्ट्रिंग के बारे में सोचना होगा।

  • यह कहां से आता है।
  • यह वहाँ क्यों है
  • आपको इसकी जांच करने की आवश्यकता क्यों है।

सरल फॉर्म फ़ील्ड उदाहरण

आप एक फॉर्म बना रहे हैं जहां उपयोगकर्ता मूल्य दर्ज कर सकता है। आप यह जांचना चाहते हैं कि उपयोगकर्ता ने कुछ लिखा है या नहीं।

एक अच्छा चर नाम not_filled_in हो सकता है

यह कोड को बहुत पठनीय बनाता है

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

बिल्कुल सीएसवी पार्सिंग उदाहरण

आप सीएसवी फाइलों को पार्स कर रहे हैं और खाली स्ट्रिंग को None रूप में पार्स None करना चाहते हैं

(चूंकि सीएसवी पूरी तरह से पाठ आधारित है, यह पूर्वनिर्धारित कीवर्ड का उपयोग किये बिना किसी का प्रतिनिधित्व None कर सकता है)

एक अच्छा चर नाम CSV_NONE हो सकता है

यह कोड को बदलने और अनुकूलित करने में आसान बनाता है यदि आपके पास एक नई सीएसवी फ़ाइल है जो किसी अन्य स्ट्रिंग के साथ ""

if csvfield == CSV_NONE:
    csvfield = None

कोड का यह टुकड़ा सही है या नहीं, इसके बारे में कोई सवाल नहीं है। यह बहुत स्पष्ट है कि यह करता है कि इसे क्या करना चाहिए।

इसकी तुलना करें

if csvfield == EMPTY_STRING:
    csvfield = None

पहला सवाल यह है कि खाली स्ट्रिंग का विशेष उपचार क्यों है?

यह भविष्य के कोडर को बताएगा कि एक खाली स्ट्रिंग को हमेशा None रूप में None माना जाना चाहिए।

ऐसा इसलिए है क्योंकि यह कोड कार्यान्वयन के साथ व्यावसायिक तर्क (क्या सीएसवी मान None होना चाहिए) मिश्रण करता है (हम वास्तव में क्या तुलना कर रहे हैं)

दोनों के बीच चिंता का एक अलगाव होना चाहिए।

क्या पाइथन में खाली स्ट्रिंग वैरिएबल की तरह कुछ है जहां आप कर सकते हैं ?:

if myString == string.empty:

भले ही खाली स्ट्रिंग मानों की जांच करने का सबसे शानदार तरीका क्या है? मुझे खाली स्ट्रिंग को जांचने के लिए हर बार हार्ड कोडिंग मिलती है।


@ 12 9 0 को जवाब देना क्षमा करें, टिप्पणियों में ब्लॉक प्रारूपित करने का कोई तरीका नहीं है। None मान पायथन में खाली स्ट्रिंग नहीं है, और न तो (रिक्त स्थान) है। एंड्रयू क्लार्क का जवाब सही है: if not myString । @rouble का उत्तर एप्लिकेशन-विशिष्ट है और ओपी के प्रश्न का उत्तर नहीं देता है। यदि आप "खाली" स्ट्रिंग की एक असाधारण परिभाषा अपनाते हैं तो आपको परेशानी होगी। विशेष रूप से, मानक व्यवहार यह है कि str(None) '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 व्यवहार को तोड़ने के दौरान @rouble आवश्यकताओं को पूरा करता है।


इस बारे में कैसा है? शायद यह "सबसे सुरुचिपूर्ण" नहीं है, लेकिन यह मेरे लिए बहुत पूर्ण, स्पष्ट और सुरक्षित लगता है:

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

क्या इसके साथ अपवाद या झूठी सकारात्मक की संभावना है?


उन लोगों के लिए जो अपाचे जैसे व्यवहार की अपेक्षा करते हैं Strings.isNullOrEmpty या Guava Strings.isNullOrEmpty :

if mystring and mystring.strip():
    print "not blank string"
else:
    print "blank string"

खाली या खाली स्ट्रिंग का परीक्षण करें (छोटा रास्ता):

if myString.strip():
    print("it's not an empty or blank string")
else:
    print("it's an empty or blank string")

जब आप लाइनों से फ़ाइल पढ़ रहे हैं और निर्धारित करना चाहते हैं कि कौन सी रेखा खाली है, तो सुनिश्चित करें कि आप .strip() उपयोग करेंगे, क्योंकि "खाली" पंक्ति में नया लाइन वर्ण है:

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

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

    # your code for non-empty lines

मैं अलग होने से पहले एकता का परीक्षण करेंगे। इसके अलावा, मैं इस तथ्य का उपयोग करूंगा कि खाली तार झूठी (या झूठी) हैं। यह दृष्टिकोण अपाचे के स्ट्रिंग यूटिलसिसब्लैंक या गुवा के स्ट्रिंग्स के समान है .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 खाली नं। खाली:

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())

मैंने एक बार बार्टक के जवाब और जावास्क्रिप्ट से प्रेरित कुछ लिखा:

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

परीक्षा:

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

सबसे सुरुचिपूर्ण तरीका शायद यह जांचना होगा कि क्या यह सच है या गलत है, उदाहरण के लिए:

if not my_string:

हालांकि, आप सफेद जगह को पट्टी करना चाहते हैं क्योंकि:

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

हालांकि, आपको शायद यह थोड़ा और स्पष्ट होना चाहिए, जब तक कि आप यह सुनिश्चित न करें कि इस स्ट्रिंग ने कुछ प्रकार की सत्यापन पारित की है और एक स्ट्रिंग है जिसे इस तरह से परीक्षण किया जा सकता है।


पीईपी 8 से , "प्रोग्रामिंग सिफारिशें" अनुभाग में :

अनुक्रमों के लिए, (तार, सूचियां, tuples), इस तथ्य का उपयोग करें कि खाली अनुक्रम झूठे हैं।

तो आपको इसका उपयोग करना चाहिए:

if not some_string:

या:

if some_string:

बस स्पष्ट करने के लिए, यदि वे खाली हैं या नहीं, तो बुलेन संदर्भ में अनुक्रमों का False या True मूल्यांकन किया जाता है। वे False या True बराबर नहीं हैं।


if stringname: स्ट्रिंग खाली होने पर false होती है। मुझे लगता है कि यह इससे आसान नहीं हो सकता है।


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

not str(myString)

यह अभिव्यक्ति उन तारों के लिए सही है जो खाली हैं। गैर-खाली तार, कोई भी और गैर-स्ट्रिंग ऑब्जेक्ट्स झूठी उत्पन्न नहीं करेंगे, चेतावनी के साथ कि ऑब्जेक्ट्स इस तर्क को विफल करने के लिए __str__ को ओवरराइड कर सकता है।





comparison-operators