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 kojidictisetkoriste 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 intpita „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()–Trueako 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 kaodict. Č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.