• בלוג
  • טיפ פייתון: המרה לבוליאנים

טיפ פייתון: המרה לבוליאנים

09/03/2025

פוסט זה כולל טיפ קצר לעבודה יעילה עם Python. אם אתם רוצים ללמוד פייתון יותר לעומק אני ממליץ על קורס Python כאן באתר.
הקורס כולל עשרות שיעורי וידאו והמון תרגול מעשי וילמד אתכם Python בצורה מקצועית מההתחלה ועד הנושאים המתקדמים.

הקוד הזה עובד יפה בפייתון:

import re

if re.search('a', 'hello'):
    print("a found in hello")
else:
    print("a not found in hello")

אבל זה לא כל כך:

if 'hello'.find('a'):
    print("found a")
else:
    print("a not found")

למרות שפייתון לא אוהב להמיר טיפוסים באופן אוטומטי, בכל הנוגע לבוליאנים הגישה של פייתון הפוכה, אלה הכללים:

  1. אם יש פונקציית __bool__ לדבר, פייתון יפעיל אותה כדי לגלות מה הערך הבוליאני.

  2. אם אין __bool__ אבל יש __len__, פייתון יפעיל את __len__ ויבדוק אם התוצאה אינה אפס.

  3. אם אין __bool__ ואין __len__ מחזירים True.

הנה כמה ניסויים:

>>> None.__bool__()
False
>>> (-1).__bool__()
True

מה עם דוגמת הביטוי הרגולארי?

>>> re.search('a', 'hallo')
<re.Match object; span=(1, 2), match='a'>
>>> re.search('a', 'hallo').__bool__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 're.Match' object has no attribute '__bool__'. Did you mean: '__copy__'?
>>> re.search('a', 'hallo').__len__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 're.Match' object has no attribute '__len__'. Did you mean: '__le__'?

לביטוי רגולארי אין __bool__ ואין __len__ לכן הוא מחזיר True. והנה ניסוי עם קלאסים שלי:

class Foo:
    def __bool__(self):
        return False

class Bar:
    pass

f = Foo()
if f:
    print("Foo 1")
else:
    print("Foo 2")

b = Bar()
if b:
    print("Bar 1")
else:
    print("Bar 2")

הפלט כצפוי Foo 2 ו Bar 1.