Курс по усъвършенствано разработване с Python
Глава
>
Ниво
Математически модули
Инспекция на кода
Цел
Изследвайте стари предмети, скрити на тавана, чрез използване на кодова интроспекция, за да установите какви са те и как се използват.
В тавана има офис, който почти не се използва, и има няколко стари сандъци, съдържащи ценности, които са били забравени отдавна. Освен ако не е посочено друго или ако не е предоставен меморандум с информацията, понякога може да бъде доста трудно да се идентифицират предметите или константите, събирани на място. Освен това, може да бъде трудно да се определи какво може да се постигне с конкретен обект или какви са неговите свойства. За да се справим с това, можем да използваме Кодова Интроспекция.
Кодовата интроспекция ни позволява да инспектираме и идентифицираме определени откъси от код и да посочим някои от неговите свойства. За тази цел ще използваме четири (4) вградени функции за интроспекция, включени в базовия python код: type(), id(), repr(), dir() и help(). Те функционират както следва:
type(): Функцията ви информира от какъв тип обект е аргументът, който подавате. Например, ако подадете променлива като аргумент, функцията ще идентифицира обекта като променлива.id(): Всеки обект, създаден в python, има уникално ID, което го идентифицира в кода. Чрез подаване на обект като аргумент на тази функция, тя ще върне уникалния идентификатор на обекта.repr(): Преобразува стойност, която не е низ, в низ, което е полезно за преобразуване на данните в четим вид.dir(): Показва всички атрибути, които даден обект притежава, което е полезно за разбиране на възможностите на конкретен тип обект.help(): Показва цялата информация за даден обект, функция, клас и т.н., която е налична в регистъра на python.
Освен това, имаме нова асинхронна функция, а именно функцията display(). Тази функция е подобна на функцията read(), но ви позволява да показвате динамични данни, подобно на функциите за кодова интроспекция, които произвеждат динамични данни. Синтаксисът ѝ е както следва: await player.display(-data-). Всички тези функции ще бъдат полезни за анализиране на данни – това е важно, когато използваме методи и започваме да импортираме нови функции, както и при анализиране на всеки код, от който искаме да идентифицираме свойства.
Ще използваме тези функции, за да идентифицираме и каталогизираме предметите, съхранявани в тавана. За начало, придвижете се към тъмния X, отбелязан върху цветните килими, започвайки с този върху червения килим. В тази зона има три (3) константи: red_container, green_container и blue_container. Тези константи представляват контейнери във всеки сандък, съответстващи на всеки от цветните килими.
За всеки X, обърнете се към сандъка и използвайте функцията open(), за да отворите сандъците. Използвайте функцията collect() с константата от съответния цветен килим, за да я вземете от сандъка. Използвайте функцията за интроспекция type(), за да идентифицирате от какъв тип константа е съдържанието в сандъка. Изходът, който тя произвежда, са сурови данни, и затова използваме функцията repr(), за да ги преобразуваме в низ. След това използвайте функцията speak(), за да покажете получения низ от комбинирането на функциите и константата, например: player.speak(repr(type(red_container))). Продължете със същата функция speak(), използвайки константата, за да идентифицирате директно съдържанието, например: player.speak(red_container).
След като всички три (3) константи бъдат събрани, инспектирани и идентифицирани, придвижете се към светлия X, отбелязан пред бюрото. Създайте три променливи с имена: item_id_red, item_id_green, item_id_blue; те ще бъдат използвани за съхранение на идентификационните номера на всяка от събраните константи. Използвайте функцията за интроспекция id(), за да получите уникалния идентификационен номер на константата, като я подадете като аргумент. Съчетайте името на променливата с името на константата, използвайки следния формат като пример: item_id_red = id(red_container). Направете това за всички три (3) променливи и константи.
След като всички три (3) променливи бъдат попълнени, съхранете ги всички в списък с име item_list и на светлия X използвайте функцията display(), за да се уверите, че списъкът е отбелязан в меморандума върху масата, както следва: await player.display(item_list).
След като списъкът бъде записан, придвижете се към тъмния X върху лилавия килим и обърнете се към бюрото. Тук ще използваме функцията dir(), за да идентифицираме какви атрибути притежава списъкът, но изходът е сурови данни, които могат да бъдат трудни за показване. За това използваме функцията repr(), за да преобразуваме данните в четим низ. Създайте променлива с име item_attributes и съхранете получения низ, както следва: item_attributes = repr(dir(item_list)). Накрая използвайте функцията display(), за да се уверите, че информацията е отбелязана в меморандума върху масата.
Придвижете се към тъмния X върху белия килим, за да направите същото, както с dir(), но използвайки help(). Това ще очертае цялата документация за използването на обекта. Създайте променлива с име item_help и съхранете получения низ, както следва: item_help = repr(help(item_list)). Накрая използвайте функцията read(), за да се уверите, че информацията също е отбелязана в меморандума върху масата, за да завършите нивото.