2.33. אינטרוספקציה¶
חופן של built-ins מאפשר לתוכנית רצה לבחון את עצמה – הערכים שאיתם היא עובדת, מרחבי השמות שבהם הערכים הללו חיים, והקשרים בין מחלקות. פנה אליהם כאשר אתה צריך לקבל החלטות על סמך מה שאובייקט באמת הוא, ולא מה שהקורא שלו טוען שהוא.
2.33.1. זהות וגיבוב (hashing)¶
id()– מספר שלם ייחודי המזהה אובייקט כל עוד הוא בחיים. שני שמות הקושרים את אותו אובייקט מחזירים את אותו id; שני אובייקטים שווים אך נבדלים – לא.
>>> a = [1, 2, 3]
>>> b = a
>>> c = [1, 2, 3]
>>> id(a) == id(b) # same list
True
>>> id(a) == id(c) # equal but distinct
False
ה-id אינו נייד בין הרצות ואינו משמעותי מעבר ל“אותו אובייקט או אובייקט שונה.“
hash()– ערך הגיבוב של אובייקט, אותו מספר ש-dictו-setמשתמשים בו כדי לאתר אותו. שני אובייקטים שווים מתגבבים לאותו ערך; רק טיפוסים בני-גיבוב (ערכים בלתי משתנים, בדרך כלל) עובדים בכלל.
>>> hash("abc") # some integer, build-dependent
-1600925533
>>> hash([1, 2])
TypeError: unhashable type: 'list'
2.33.2. תשאול טיפוסים ויכולת קריאה¶
type()– המחלקה המדויקת של ערך.type(x) is intשואל ”האם x הוא בדיוק int“ (ללא תת-מחלקות);isinstance()הוא בדרך כלל מה שאתה רוצה במקום זאת.isinstance()– ”האם x הוא מופע של מחלקה זו, או תת-מחלקה שלה?“ הכלי הסטנדרטי לשיגור מבוסס-טיפוס בתוך פונקציות.issubclass()– המקבילה ברמת המחלקה. מקבל שתי מחלקות ולא מופע.callable()–Trueאם ניתן לקרוא לארגומנט עם(). שימושי כאשר אתה מקבל ארגומנט שעשוי להיות פונקציה או עשוי להיות ערך פשוט.
>>> isinstance(3, int)
True
>>> isinstance(True, int) # bool is a subclass of int
True
>>> issubclass(bool, int)
True
>>> callable(len)
True
>>> callable(10)
False
דפוס המשתמש ב-callable:
def call_or_return(x):
return x() if callable(x) else x
2.33.3. התבוננות בתחומים¶
globals()– מרחב השמות הגלובלי של המודול כ-dict. קריאה ממנו עובדת; כתיבה אליו אמיתית, אך עשייה זו מחוץ לחקירת REPL הופכת תוכנית לקשה למעקב.locals()– מרחב השמות המקומי באתר הקריאה. בתוך פונקציה הוא משקף את המשתנים המקומיים; שינוי המילון המוחזר אינו מובטח שייכתב בחזרה למשתנים המקומיים בפועל (התנהגות מוגדרת-מימוש).
name = "OpenMV"
def f():
x = 10
print(globals()["name"]) # OpenMV
print(locals()) # {'x': 10}
שני אלה שימושיים לניפוי באגים ולכלים שצריכים לגלות מה מוגדר. פנה אליהם במשורה בקוד רגיל – פונקציה שמשנה globals() היא אחד הדברים הקשים ביותר להבנה ב-Python.
2.33.4. ראה גם¶
dir() ו-help(), המכוסים ב-debugging, הם כלי האינטרוספקציה היומיומיים לחקירת המשטח של אובייקט לא מוכר.