Python тилиндеги декораторлор
Функциянын кодун өзгөртпөстөн, аны кошумча жүрүм-турум менен ороп алыңыз
@decorator сабы — функцияны анын оролгон версиясына кайра ыйгаруунун ыңгайлуу кыскартмасы. Ушул жол менен көптөгөн функцияларга бирин да түзөтпөстөн логирлөө, убакытты өлчөө, кэштөө же жетүүнү текшерүү кошуса болот.
- функциялар эмне үчүн биринчи класстагы объекттер экенин түшүндүрүү,
- башка функциянын үстүнөн жабылган ички орогуч функцияны жазуу,
- декоратор түзүп, аны
@аркылуу колдонуу, - каалаган аргументтерди
*args, **kwargsаркылуу өткөрүү, functools.wrapsменен баштапкы атты жана документация сабын сактоо.
1. Функциялар — биринчи класстагы объекттер
Декораторлор түшүнүктүү болушу үчүн бир нерсени эстен чыгарбаңыз: Python-до функция — бул сан же тизме сыяктуу эле кадимки объект. Аны өзгөрмөгө сактап, тизмеге салып, башка функцияга аргумент катары берип, ал тургай функциядан кайтарса болот.
def shout(text):
return text.upper()
yell = shout # store the function object (no parentheses!)
print(yell("hello")) # HELLO
def run_twice(func, value):
return func(value) + " " + func(value)
print(run_twice(shout, "hi")) # HI HI
Байкаңыз: yell = shout кашаасыз жазылат — биз функциянын натыйжасын эмес, өзүн көчүрөбүз. Дал ушул функцияларды өткөрө алуу мүмкүнчүлүгүнө декоратор таянат.
2. Ички функциялар жана жабуулар (closures)
Функцияны башка функциянын ичинде аныктаса болот. Ички функция сырткы функциянын өзгөрмөлөрүн окуй алат жана сырткы функция бүткөндөн кийин да аларга шилтемени сактайт. Курчап турган чөйрөдөн маанилерди эстеп калган ички функцияны жабуу (closure) деп аташат.
def make_multiplier(factor):
def multiply(n):
return n * factor # 'factor' comes from the outer scope
return multiply # return the inner function object
triple = make_multiplier(3)
print(triple(10)) # 30
print(triple(4)) # 12
make_multiplier ички multiply функциясын кайтарат, ал дагы эле factor = 3 дегенди эстейт. Декоратор дал ушундай курулат: сырткы функция ички орогучту аныктап, аны кайтарат.