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
Lepaskan: 2024-12-01 21:10:15
asal
238 orang telah melayarinya

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
Salin selepas log masuk

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'
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan