Funkcija dir

10.5 Funkcija dir 

Problem: Dobro, sada vidim šta znače imena sa duplom donjom crtom, ali, u svim dosadašnjim primerima imamo komandu if __name__ == '__main__' . Nisam primetio da sam igde definisao promenljivu koja se zove __name__. Moje pitanje je – otkud ona u mom programu?
Odgovor: Ti pišeš i, što je još važnije, izvršavaš svoje programe u Pythonu. Samim tim Python mora da zna šta se dešava i šta je gde. Iz tog razloga, sam Python tvom programu (funkcijama, modulima...) dodeljuje neke promenljive koje služe za neki rad.
Čekaj, on ubacuje nešto u moj program?!?
Zapravo, ne! Tvoj program kakav je – takav je. Python samo mora da „prati“ šta se dešava, kako bi znao šta da uradi! I, on to ni ne krije, jer zapravo ti u svakom trenutku možeš da vidiš (pa čak i da izmeniš, što ti ne preporučujem) šta je dobilo kakvo ime.
Kako, šta?
Sad kada ti pokažem neke stvari, sve će ti postati jasnije.
U svakom trenutku svog rada u Pythonu ti možeš da koristiš jednu od „ugrađenih“ funkcija, koja nosi ime dir(). Ova funkcija ti može poslužiti da izlista sve identifikatore (u suštini imena promenljivih, funkcija, klasa, modula...) koji su definisani sa nekim objektom. Na primer, za neki naš modul lista identifikatora će uključiti sva imena funkcija, klasa i promenljivih koji su definisani u tom modulu. Mada deluje konfuzno, predlažem da pokreneš interaktivni prompt, pa da to vidiš i praktično.
No, mala napomena - kada funkciji dir() prosledimo neko ime (npr modula), ona će da nam vrati listu imena definisanih u tom (prosleđenom) modulu. Ali ako joj ne prosledimo nijedan argument, ona će da nam vrati listu imena definisanih u tekućem modulu. 
>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__'] 
>>> 
Opa, čekaj, rekao si iz tekućeg modula? Ali ja nisam ništa importovao! 
Pa zar nije i interaktivni prompt samo jedan modul? Razmisli malo o tome....
Ali, idemo mi dalje, vidimo da postoje već predefinisana imena koja služe Pythonu da zna neke osnovne stvari o našem radu. Hajde za početak da definišemo neku funkciju, a potom ćemo opet upotrebiti dir():
>>> def sabiranje(a): 
...     c = a + 5 
...     return c 
... 
>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__', 'sabiranje'] 
>>> 
Opa, posle definisanja funkcije – njeno ime se pojavilo u spisku koji nam je vratila dir() funkcija! Hajde sada da importujemo neki modul, na primer modul sys sa kojim smo već radili:
>>> import sys 
>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__', 'sabiranje', 'sys'] 
>>> 
Dakle, dir() funkcija nam, bez prosleđivanja ikakvih argumenata, vraća skoro istu listu korišćenih imena u interaktivnom promptu. Sada vidimo da je u toj listi i ime modula kojeg smo importovali (tj. sys). No, hajde sada da funkciji dir() prosledimo neke argumente – hajde na primer da joj prosledimo ime naše funkcije sabiranje():
>>> dir(sabiranje) 
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__'] 
>>> 
Auh... Ako si se uplašio veličinom ovog izlaza, hajde da iskoristimo dir() funkciju nad sys modulom. Nemoj se uplašiti od ogromnog spiska imena koje modul definiše.
>>> dir(sys) 
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_getframe', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'hash_info', 'hexversion', 'int_info', 'intern', 'last_traceback', 'last_type', 'last_value', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions'] 
>>> 
Čekaj malo, jel ovo znači da su ovo imena koja mogu koristiti u svom programu? Kako?
Upravo! Sve što treba da uradiš je da uvezeš neki modul, zatim proveriš sa funkcijom dir() šta ti je sa njim dostupno, a potom to i primeniš, na primer: sys.version_info:
>>> sys.version _info
sys.version_info(major=3, minor=2, micro=3, releaselevel='final', serial=0) 
>>> 
A sad ću da te naučim i jednu novu komandu – del.
Naredba del se koristi za brisanje promenljivih/imena promenljivih. To samo znači da posle izvršenja del komande, na primer del sabiranje , više nećeš moći da koristiš funkciju koja se zove sabiranje - kao da nikad nije ni postojala uopšte. Često se koristi za oslobađanje memorije, ukoliko smo koristili nešto što je veoma veliiiikoooo, samo ga – obrišemo (heh.... videćeš i neke izuzetke od ovog pravila, koji se mogu pojaviti u mnogim situacijama, ali nećemo sada o tome, budi srećan što znaš i ovoliko!).
Eh, sad mi je cilj da ti pokažem del komandu u akciji, pa ću definisati jednu novu promenljivu, koju ću nazvati jednostavno: a, i njoj ću dodeliti neku vrednost, a zatim ćemo iskoristiti funkciju dir() kako bi smo pratili šta se dešava.
>>> a = 1658 
>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__', 'a', 'sabiranje', 'sys'] 
>>> 
Sad postoji još jedna dodatna vrednost u listi, i ona nosi isto ime kao i promenljiva koju smo definisali. Hajde sada da uklonimo ovu promenljivu pomoću del komande i da vidimo ima li promene u izlazu funkcije dir():
>>> del a 
>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__', 'sabiranje', 'sys'] 
>>> 
Eto... Promenljiva sa imenom a više ne postoji! Hajde sada da to uradimo i sa našom funkcijom, ali uz malu začkoljicu....
>>> zbir = sabiranje 
>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__', 'sabiranje', 'sys', 'zbir'] 
>>> del sabiranje 
>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__', 'sys', 'zbir'] 
>>> zbir 
<function sabiranje at 0xb6e0c1ec> 
>>> zbir(89) 
94 
>>> del zbir 
>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__', 'sys'] 
>>> 
Uh, iako smo obrisali funkciju sabiranje(), ostala nam je funkcija zbir() koju prethodno, nismo definisali, već smo joj samo dodelili vrednost koja je bila – ime funkcije sabiranje()! I posle brisanja sabiranje() funkcije, postojalo je ime zbir, koje je bilo upereno na mesto u memoriji računara, u kojem je smeštena funkcija sabiranje(). Šta to znači? Pa jednostavno znači da – Python neće uništiti (ukloniti iz memorije) bilo koji objekat, dokle god postoji neko ime koje se odnosi na taj objekat.
U našem slučaju, mi smo kreirali objekat koji je bio funkcija i nosio je naziv sabiranje(), i kao takav je uskladišten u memoriji računara. Posle toga smo funkciji sabiranje() dodelili još jedno ime – zbir. U memoriji računara je to još uvek funkcija sabiranje(), samo što ovoga puta poseduje dva imena. Posle brisanja funkcije sabiranje – ostalo je ime zbir! Budući da je to ime ostalo, Python smatra da nam je potrebno, znači, neće ni brisati funkciju sabiranje() iz memorije računara, jednostavno – sada funkcija sabiranje() ne postoji za Python, ali postoji ista funkcija zbir(), a što bi onda vršio sporu promenu u memoriji? Samo je putokaz ka mestu u memoriji okrenut na drugu stranu! Ali, kada smo odlučili da obrišemo i ime zbir – više nema nikakvog razloga da u memoriji bude čuvana funkcija sabiranje(), te se to mesto prazni za nešto drugo!
Suštinski, ovo znači da naredba del će da ukloni samo ime objekta, ukoliko je taj isti objekat  prisutan u našem programu sa različitim imenima, ili će ukloniti sam taj objekat, ukoliko je on prisutan samo pod jednim imenom u našem programu.
I za kraj, jedna napomena: imaj na umu da se dir() funkcija i del komanda mogu primenjivati na bilo koje objekte u Pythonu. Na primer, probaj dir('print') da se malo upoznaš sa atributima funkcije prikaza teksta, ili dir(str) za atribute stringova.
Budući da je dir() funkcija prilično moćna, mnogi programeri je koriste kao neku vrstu pomoći pri radu u Pythonu, osećaj se sasvim slobodno da i ti budeš jedan od njih.
Za malo dublje razmišljanje probaj help(vars), a zatim u funkciju vars() ubaci neki objekat, radi male „moždane“ gimnastike.

10.4 Izrada sopstvenih
modula
Indeks 10.6 Pakovanje modula

Primjedbe

Popularno

Kako televizija štetno utiče na Vaše zdravlje finansije?

Da li je TV kviz Slagalica "prevara"?

Tu je novi Qt creator 4.4.0!

Kada prijatelji odlaze

Microsoft objavio - nova verzija Windowsa stiže...

Sitnije promene na blogu...

Opet su se pojavili lažni kuponi brenda "IDEA" na društvenim mrežama

Poslednji pozdrav izgubljenom vremenu

Sistemska greška

Fake poet