1. Python tili imkoniyatlari Pythonni ko`chirish


Dekoratorlar bilan ishlashning ba`zi xususiy holatlari



Yüklə 2,19 Mb.
səhifə67/78
tarix19.12.2023
ölçüsü2,19 Mb.
#152124
1   ...   63   64   65   66   67   68   69   70   ...   78
1. Python tili imkoniyatlari Pythonni ko`chirish

Dekoratorlar bilan ishlashning ba`zi xususiy holatlari


  • Dekoratorlar funksiyalarning ishlashini birmuncha sekinlashtirishini esda saqlang.

  • Siz funksiyani dedekoratsiyalay olmaysiz. Albatta, keyinchalik dekoratorni funksiyadan ajratib olishga qaratilgan amaliyotlar ham mvjud bo`lib, lekin bu unchalik yaxshi g`oya emas. Undan ko`ra, dekoratsiyalangan funksiyani qaytarishning imkoni yo`qligini eslab qolish qulayroq.

  • Dekoratorlar funksiyalarni qamrab oladi va bu ularni sozlashni qiyinlashtiradi.

So`nggi qayd etilgan muammoni qisman functools modulida qamrab olinayotgan funksiya haqidagi barcha ma`lumotlarni (uning nomi, qaysi moduldanligi, uning hujjatlashtirilishi va h.k.) qobiq-funksiyaga nusxalovchi functools.wraps funksiyasini qo`shish yo`li bilan hal etildi.
E
>>> def foo():
... print("foo")
...
>>> print(foo.__name__)
foo
>>> # Lekin dekoratorlar ishlarning normal yo`nalishiga xalaqit beradi:
... def bar(func):
... def wrapper():
... print("bar")
... return func()
... return wrapper
...
>>> @bar
... def foo():
... print("foo")
...
>>> print(foo.__name__)
wrapper
>>> import functools # "functools" bunda bizga yordam berishi mumkin
>>> def bar(func):
... # "func" ni qamrovchi "wrapper" ni e`lon qilamiz
... # va uni ishga tushiramiz:
... @functools.wraps(func)
... def wrapper():
... print("bar")
... return func()
... return wrapper
ng qizig`i – functool.wraps ning o`zi ham dekoratordir.



...
>>> @bar
... def foo():
... print("foo")
...
>>> print(foo.__name__)
foo


Dekoratorlarning qo`llanilishiga misollar


Dekoratorlardan chetki kutubxonalardagi funksiyalarning imkoniyatlarini oshirish maqsadida (kodlarini o`zgartira olmaydiganlarimizni) yoki sozlash jarayonini osonlashtirish (hali tayyor bo`lmagan kodni o`zgartirishni istamasak) maqsadlarida foydalanishimiz mumkin.

>>> def benchmark(func):
... """
... Dekoratsiyalangan funksiyaning bajarilishi uchuhn
... ketgan vaqtni chiqaruvchi dekorator
... """
... import time
... def wrapper(*args, **kwargs):
... t = time.clock()
... res = func(*args, **kwargs)
... print(func.__name__, time.clock() - t)
... return res
... return wrapper
...
>>> def logging(func):
... """
... Kod ishini ro`yxatga oluvchi dekorator.
... To`g`ri, u faqat chaqirishlarni chiqaradi, lekin bu yerda ro`yxatga olish ham
bo`lishi mumkin edi.
... """
... def wrapper(*args, **kwargs):
... res = func(*args, **kwargs)
... print(func.__name__, args, kwargs)
... return res
... return wrapper
...

Bundan tashqari dekoratorlardan turli funksiyalarning imkoniyatlarini har safar uni qaytadan yozib chiqmasdan aynan bitta kod yordamida kengaytirish uchun ishlatishimiz ham mumkin.



>>> def counter(func):
... """
... Dekoratsiyalanayotgan funksiyaning chaqirishlari sonini hisoblovchi
... va chiqaruvchi dekorator.
... """
... def wrapper(*args, **kwargs):
... wrapper.count += 1
... res = func(*args, **kwargs)
... print("{0} ÈâÒÇ ÉâÎÉÇÔÇ: {1} x".format(func.__name__, wrapper.count))
... return res
... wrapper.count = 0
... return wrapper
...
>>> @benchmark
... @logging
... @counter
... def reverse_string(string):
... return ''.join(reversed(string))
...
>>> print(reverse_string("А роза упала на лапу Азора"))
reverse_string срфйшкшдвш: 1x
wrapper ('А роза упала на лапу Азора',) {}
wrapper 0.00011799999999997923
арозА упала на лапу азор А
>>> print(reverse_string("A man, a plan, a canoe, pasta, heros, rajahs, a coloratura,"
... "maps, snipe, percale, macaroni, a gag, a banana bag, a tan, a tag,"
... "a banana bag again (or a camel), a crepe, pins, Spam, a rut, a Rolo, cash,"
... "a jar, sore hats, a peon, a canal: Panama!"))
reverse_string chaqirildi: 2x
wrapper ('A man, a plan, a canoe, pasta, heros, rajahs, a coloratura,maps, snipe, .
˓→..',) {}
wrapper 0.00017800000000001148
!amanaP :lanac a ,noep a ,stah eros ,raj a,hsac ,oloR a ,tur a ,mapS ,snip ,eperca , ...

32-bob


Yüklə 2,19 Mb.

Dostları ilə paylaş:
1   ...   63   64   65   66   67   68   69   70   ...   78




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©genderi.org 2024
rəhbərliyinə müraciət

    Ana səhifə