python - لغة - حلقة التكرار for




أكثر طريقة أنيقة لمعرفة ما إذا كانت السلسلة فارغة في بايثون؟ (13)

هل تملك بيثون شيئًا مثل متغير السلسلة الفارغ حيث يمكنك القيام به ؟:

if myString == string.empty:

بغض النظر عن الطريقة الأكثر أناقة للتحقق من قيم السلسلة الفارغة؟ أجد من الصعب ترميز "" كل مرة لفحص سلسلة فارغة ليست جيدة.


أجد hardcoding (كذا) "" في كل مرة للتحقق من سلسلة فارغة ليست جيدة.

نهج التعليمات البرمجية نظيفة

القيام بذلك: foo == "" هي ممارسة سيئة للغاية. "" هي قيمة سحرية. يجب عليك عدم التحقق من القيم السحرية (المعروفة أكثر باسم الأرقام السحرية )

ما يجب عليك فعله هو المقارنة مع اسم المتغير الوصفي.

أسماء المتغيرات الوصفية

قد يعتقد المرء أن "empty_string" هو اسم متغير وصفي. ليس كذلك .

قبل أن تذهب وتفعل empty_string = "" وتعتقد أن لديك اسم متغير رائع للمقارنة به. هذا ليس ما "الاسم المتغير الوصفي" يعني.

يعتمد اسم المتغير الوصفي الجيد على السياق الخاص به. عليك أن تفكر في ما هي السلسلة الفارغة.

  • حيث أنها لا تأتي من.
  • لماذا هناك.
  • لماذا تحتاج إلى التحقق من ذلك.

مثال بسيط لحقل النموذج

أنت تقوم ببناء نموذج حيث يمكن للمستخدم إدخال القيم. تريد التحقق مما إذا كان المستخدم كتب شيئا أم لا.

قد يكون اسم المتغير الجيد not_filled_in

هذا يجعل الرمز مقروءًا جدًا

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

مثال شامل لتحليل CSV

أنت بصدد تحليل ملفات CSV وتريد أن يتم تحليل السلسلة الفارغة على أنها بلا

(بما أن ملف CSV يستند إلى النص بالكامل ، فلا يمكنه تمثيل None بدون استخدام كلمات رئيسية محددة مسبقًا)

قد يكون اسم المتغير الجيد هو CSV_NONE

يجعل هذا الرمز من السهل تغييره وتكييفه إذا كان لديك ملف CSV جديد يمثل بلا مع سلسلة أخرى غير ""

if csvfield == CSV_NONE:
    csvfield = None

لا توجد أسئلة حول ما إذا كانت هذه الشفرة صحيحة. من الواضح أنه يقوم بما يجب عليه فعله.

قارن هذا ل

if csvfield == EMPTY_STRING:
    csvfield = None

السؤال الأول هنا ، لماذا تستحق السلسلة الفارغة معاملة خاصة؟

هذا من شأنه أن يخبر المبرمجين المستقبليين أنه يجب اعتبار سلسلة فارغة دائمًا بلا.

هذا لأنه يخلط منطق الأعمال (ما هي قيمة CSV التي يجب أن تكون بلا) مع تنفيذ الكود (ما الذي نقارنه بالفعل)

يجب أن يكون هناك فصل بين القلق بين الاثنين.


أود اختبار الندية قبل التجريد. أيضا ، أود أن استخدام حقيقة أن سلاسل فارغة هي False (أو Falsy). يشبه هذا الأسلوب StringUtils.isBlank الخاص بـ Apache أو Strings.isNullOrEmpty الخاص بـ Apache.

هذا ما سأستخدمه لاختبار ما إذا كانت السلسلة إما بلا أو فارغة أو فارغة:

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 فارغة:

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.strip():
    print("it's not an empty or blank string")
else:
    print("it's an empty or blank string")

السلاسل الفارغة هي "falsy" مما يعني أنها تعتبر كاذبة في سياق منطقي ، بحيث يمكنك القيام بذلك:

if not myString:

هذه هي الطريقة المفضلة إذا كنت تعرف أن المتغير الخاص بك هو سلسلة. إذا كان المتغير الخاص بك يمكن أن يكون أيضًا نوعًا آخر ، فيجب عليك استخدام myString == "" . راجع وثائق اختبار اختبار القيمة للقيم الأخرى غير الصحيحة في السياقات المنطقية.


عندما تقرأ الملف حسب السطور وترغب في تحديد ، أي سطر فارغ ، تأكد من أنك ستستخدم .strip() ، لأن هناك حرف خط جديد في سطر "فارغ":

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

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

    # your code for non-empty lines

في تجربتي اختبار "" لا تعمل دائما. لقد عملت هذه الاختبارات البسيطة دائمًا بالنسبة لي:

if MyString == 'None'

أو

if MyString != 'None'

قراءة جدول بيانات Excel أريد أن أتوقف عندما يحصل على عمود فارغ باستخدام الحلقة التالية أثناء:

while str(MyString) != 'None':

قد يكون لديك نظرة على هذا تعيين قيمة فارغة أو سلسلة في بيثون

هذا حول مقارنة السلاسل الفارغة. لذلك بدلا من اختبار الفراغ مع not ، قد اختبار هو سلسلة الخاص بك يساوي سلسلة فارغة مع "" سلسلة فارغة ...


كتبت ذات مرة شيئًا مشابهًا لإجابة Bartek و javascript المستوحى:

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

اختبار:

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

لأولئك الذين يتوقعون سلوكًا مثل Apache StringUtils.isBlank أو Guava Strings.isNullOrEmpty :

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

من PEP 8 ، في قسم "توصيات البرمجة" :

بالنسبة للتسلسلات ، (السلاسل ، القوائم ، المجموعات) ، استخدم حقيقة أن التتابعات الفارغة خاطئة.

لذلك يجب عليك استخدام:

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)

هذا التعبير هو True للسلاسل الفارغة. سلاسل غير فارغة ، كل شيء والكائنات غير سلسلة ستنتج كلها False ، مع التحذير أن الكائنات قد تتجاوز __str__ لإحباط هذا المنطق عن طريق إرجاع قيمة كاذبة.





comparison-operators