2.33. Introspekcija

Šačica ugrađenih funkcija omogućuje programu u izvođenju da ispituje samog sebe – vrijednosti s kojima radi, prostore imena u kojima te vrijednosti žive te odnose među klasama. Posegnite za njima kada trebate donositi odluke na temelju onoga što objekt zapravo jest, a ne onoga što njegov pozivatelj tvrdi da jest.

2.33.1. Identitet i sažimanje (hashing)

  • id() – jedinstveni cijeli broj koji identificira objekt sve dok je živ. Dva imena koja vežu isti objekt vraćaju isti id; dva jednaka, ali različita objekta to ne čine.

>>> 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 nije prenosiv između pokretanja i nema značenje izvan „isti objekt ili različit objekt”.

  • hash() – hash vrijednost objekta, isti broj koji dict i set koriste za njegovo pronalaženje. Dva jednaka objekta imaju istu hash vrijednost; samo hashabilni tipovi (uglavnom nepromjenjive vrijednosti) uopće rade.

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

2.33.2. Ispitivanje tipova i mogućnosti pozivanja

  • type() – točna klasa vrijednosti. type(x) is int pita „je li x točno int” (bez podklasa); isinstance() je obično ono što umjesto toga želite.

  • isinstance() – „je li x instanca ove klase ili njezine podklase?” Standardni alat za otpremu temeljenu na tipu unutar funkcija.

  • issubclass() – pandan na razini klase. Prima dvije klase umjesto instance.

  • callable()True ako se argument može pozvati s (). Korisno kada primite argument koji može biti funkcija ili obična vrijednost.

>>> isinstance(3, int)
True
>>> isinstance(True, int)        # bool is a subclass of int
True
>>> issubclass(bool, int)
True
>>> callable(len)
True
>>> callable(10)
False

Obrazac koji koristi callable:

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

2.33.3. Pregledavanje dosega

  • globals() – globalni prostor imena modula kao dict. Čitanje iz njega radi; pisanje u njega je stvarno, ali to izvan REPL istraživanja čini program teškim za praćenje.

  • locals() – lokalni prostor imena na mjestu poziva. Unutar funkcije odražava lokalne varijable; mijenjanje vraćenog rječnika ne jamči pisanje natrag u stvarne lokalne varijable (ponašanje definirano implementacijom).

name = "OpenMV"

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

Ove dvije korisne su za otklanjanje pogrešaka i za alate koji trebaju otkriti što je definirano. Posegnite za njima štedljivo u redovnom kodu – funkcija koja mijenja globals() jedna je od najtežih stvari za razumijevanje u Pythonu.

2.33.4. Vidi također

dir() i help(), opisani u debugging, svakodnevni su alati za introspekciju za istraživanje površine nepoznatog objekta.