Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah `functools.wraps` Mengekalkan Atribut Fungsi Asal dalam Penghias Python?

Bagaimanakah `functools.wraps` Mengekalkan Atribut Fungsi Asal dalam Penghias Python?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-01 21:10:15229semak imbas

How Does `functools.wraps` Preserve Original Function Attributes in Python Decorators?

Memahami functools.wraps

Dalam pengaturcaraan Python, penghias biasanya digunakan untuk menambah kefungsian pada fungsi. Walau bagaimanapun, menggunakan penghias kadangkala boleh menggantikan fungsi asal dengan yang baharu, yang membawa kepada kehilangan atribut fungsi penting seperti nama, docstring dan senarai hujah.

Di sinilah fungsi functools.wraps dimainkan. Ia adalah penghias yang membolehkan pengguna mengekalkan sifat-sifat fungsi asal apabila menggunakan penghias. Pada asasnya, ia "membungkus" fungsi baharu yang dicipta oleh penghias dengan atribut fungsi asal.

Pertimbangkan contoh berikut:

def logged(func):
    @wraps(func)
    def with_logging(*args, **kwargs):
        print(func.__name__ + " was called")
        return func(*args, **kwargs)
    return with_logging

Apabila anda menggunakan penghias ini, ia memastikan bahawa fungsi itu mengekalkan nama asal, docstring dan senarai hujahnya, walaupun ia telah diubah suai oleh fungsi pengelogan. Berikut ialah contoh cara ia berfungsi:

@logged
def f(x):
    """does some math"""
    return x + x * x

print(f.__name__)  # prints 'f'
print(f.__doc__)   # prints 'does some math'

Tanpa functools.wraps, penghias akan menggantikan fungsi asal dengan fungsi baharu dengan nama yang berbeza dan tiada docstring, menjadikannya sukar untuk mengenal pasti dan mentafsir tingkah laku fungsi.

Atas ialah kandungan terperinci Bagaimanakah `functools.wraps` Mengekalkan Atribut Fungsi Asal dalam Penghias Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn