Sobes.tech
Junior — Middle
72

Python-да декораторды пайдалану түпнұсқа функцияға қол жеткізуді жоғалтуға әкеледі ме?

AI-дан жауап

sobes.tech AI

Python-да декораторды қолдану түпнұсқа функцияға қол жеткізуді міндетті түрде жоғалтпайды, бірақ бұл декоратор қалай жазылғанына байланысты.

Егер декоратор түпнұсқа функцияға сілтемені сақтамаса, оған қол жеткізу қиын болуы мүмкін. Мұны болдырмау үшін әдетте __wrapped__ атрибуты пайдаланылады, ол орауыш ішіндегі түпнұсқа функцияны сақтайды.

Түпнұсқа функцияның метадеректерін сақтайтын дұрыс декоратордың мысалы:

import functools

def my_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print("Функция шақырылуы алдында")
        result = func(*args, **kwargs)
        print("Функция шақырылуы кейін")
        return result
    return wrapper

@my_decorator
 def greet(name):
    print(f"Сәлем, {name}!")

# Түпнұсқа функцияға қол жеткізу
print(greet.__wrapped__)  # <function greet at 0x...>

Осылайша, functools.wraps көмегімен декоратор түпнұсқа функцияға сілтемені сақтайды, және оған қол жеткізу сақталады.