Bagaimana untuk Mengekalkan Tandatangan Fungsi Apabila Menggunakan Penghias dalam Python?

DDD
Lepaskan: 2024-10-17 16:59:58
asal
446 orang telah melayarinya

How to Preserve Function Signatures When Using Decorators in Python?

Memelihara Tanda Tangan Fungsi Berhias

Penghias ialah alat yang berkuasa untuk mempertingkatkan kefungsian fungsi Python. Walau bagaimanapun, mereka kadangkala boleh mengaburkan tandatangan fungsi asal. Ini boleh menjadi masalah untuk dokumentasi, penyahpepijatan dan alatan automatik.

Masalah:

Pertimbangkan penghias generik yang menukar semua argumen kepada integer:

<code class="python">def args_as_ints(f):
    def g(*args, **kwargs):
        args = [int(x) for x in args]
        kwargs = dict((k, int(v)) for k, v in kwargs.items())
        return f(*args, **kwargs)
    return g</code>
Salin selepas log masuk

Semasa hiasan berfungsi seperti yang diharapkan, tandatangan fungsi yang dihias digantikan dengan "args, *kwargs", kehilangan maklumat tentang hujah asal.

Penyelesaian:

Beberapa penyelesaian wujud, tetapi tiada satu pun yang memuaskan sepenuhnya:

  • Menyalin tandatangan ke dalam docstring secara manual.
  • Mencipta penghias baharu untuk setiap tandatangan tertentu.
  • Membina fungsi berhias secara manual dengan exec.

Penyelesaian:

modul penghias menawarkan penyelesaian yang elegan:

<code class="python">import decorator

@decorator.decorator
def args_as_ints(f, *args, **kwargs):
    args = [int(x) for x in args]
    kwargs = dict((k, int(v)) for k, v in kwargs.items())
    return f(*args, **kwargs)</code>
Salin selepas log masuk

Penghias ini mengekalkan tandatangan fungsi asal dengan menghantarnya sebagai argumen kepada fungsi yang dibalut.

Penghias Yang Diperbaiki:

<code class="python">@args_as_ints
def funny_function(x, y, z=3):
    """Computes x*y + 2*z"""
    return x*y + 2*z</code>
Salin selepas log masuk

Kini, fungsi funny_function yang dihias mengekalkan tandatangan asalnya:

>>> help(funny_function)
Help on function funny_function in module __main__:

funny_function(x, y, z=3)
    Computes x*y + 2*z
Salin selepas log masuk

Python 3.4 :

Untuk Python 3.4 dan ke atas, functools.wraps menyediakan penyelesaian yang serupa:

<code class="python">import functools

def args_as_ints(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        args = [int(x) for x in args]
        kwargs = dict((k, int(v)) for k, v in kwargs.items())
        return func(*args, **kwargs)
    return wrapper</code>
Salin selepas log masuk

Dengan menggunakan teknik ini, penghias boleh meningkatkan fungsi fungsi sambil mengekalkan tandatangan asal mereka, memastikan kejelasan dan konsistensi dalam pangkalan kod.

Atas ialah kandungan terperinci Bagaimana untuk Mengekalkan Tandatangan Fungsi Apabila Menggunakan Penghias dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan