2.33. İçgözlem (introspection)

Birkaç yerleşik, çalışan bir programın kendisini incelemesine izin verir – üzerinde çalıştığı değerleri, bu değerlerin bulunduğu ad alanlarını ve sınıflar arasındaki ilişkileri. Bir nesnenin, çağıranının iddia ettiği şey yerine gerçekte ne olduğuna dayalı kararlar vermeniz gerektiğinde bunlara başvurun.

2.33.1. Kimlik ve hash’leme

  • id() – bir nesneyi, yaşadığı sürece tanımlayan benzersiz bir tam sayı. Aynı nesneye bağlanan iki ad aynı id’yi döndürür; eşit ama farklı iki nesne döndürmez.

>>> 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, çalıştırmalar arasında taşınabilir değildir ve “aynı nesne mi yoksa farklı nesne mi” dışında anlamlı değildir.

  • hash() – bir nesnenin hash değeri; dict ve set‘in onu aramak için kullandığı aynı sayı. Eşit iki nesne aynı değere hash’lenir; yalnızca hash’lenebilir türler (çoğunlukla değiştirilemez değerler) tümüyle çalışır.

>>> hash("abc")           # some integer, build-dependent
-1600925533
>>> hash([1, 2])
TypeError: unhashable type: 'list'

2.33.2. Türleri ve çağrılabilirliği sorgulama

  • type() – bir değerin tam sınıfı. type(x) is int, “x tam olarak bir int mi” diye sorar (alt sınıflar yok); genellikle bunun yerine istediğiniz şey isinstance()‘tır.

  • isinstance() – “x, bu sınıfın veya onun bir alt sınıfının bir örneği mi?” Fonksiyonlar içinde tür tabanlı görevlendirme için standart araç.

  • issubclass() – sınıf düzeyindeki karşılığı. Bir örnek yerine iki sınıf alır.

  • callable() – argüman () ile çağrılabiliyorsa True. Bir fonksiyon olabilecek veya düz bir değer olabilecek bir argüman aldığınızda kullanışlıdır.

>>> 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 kullanan bir desen:

def call_or_return(x):
    return x() if callable(x) else x

2.33.3. Kapsamlara bakmak

  • globals() – modülün global ad alanı, bir dict olarak. Ondan okumak işe yarar; ona yazmak gerçektir, ancak bunu REPL keşfi dışında yapmak bir programı takip etmeyi zorlaştırır.

  • locals() – çağrı noktasındaki yerel ad alanı. Bir fonksiyon içinde yerel değişkenleri yansıtır; döndürülen sözlüğü değiştirmek, gerçek yerel değişkenlere geri yazılacağının garantisi değildir (uygulamaya bağlı davranış).

name = "OpenMV"

def f():
    x = 10
    print(globals()["name"])    # OpenMV
    print(locals())             # {'x': 10}

Bu ikisi, hata ayıklama ve neyin tanımlandığını keşfetmesi gereken araçlar için kullanışlıdır. Normal kodda bunlara seyrek başvurun – globals()‘ı değiştiren bir fonksiyon, Python’da mantığını yürütmesi en zor şeylerden biridir.

2.33.4. Ayrıca bakınız

debugging sayfasında ele alınan dir() ve help(), bilinmeyen bir nesnenin yüzeyini keşfetmek için günlük içgözlem araçlarıdır.