Rumah pembangunan bahagian belakang Tutorial Python Penghias Python ditaip sepenuhnya dengan parameter

Penghias Python ditaip sepenuhnya dengan parameter

Apr 13, 2023 pm 05:58 PM
python Penghias

Penghias Python ditaip sepenuhnya dengan parameter

Kod yang ditunjukkan dalam artikel pendek ini diambil daripada projek sumber terbuka kecil saya yang direka oleh kontrak, yang menyediakan penghias bertaip. Penghias adalah konsep yang sangat berguna dan anda pasti akan menemui banyak tentangnya dalam talian. Ringkasnya, mereka membenarkan kod dilaksanakan setiap kali (sebelum dan selepas) fungsi yang dihias dipanggil. Dengan cara ini anda boleh mengubah suai parameter fungsi atau mengembalikan nilai, mengukur masa pelaksanaan, menambah pengelogan, melakukan pemeriksaan jenis masa pelaksanaan dan banyak lagi. Ambil perhatian bahawa penghias juga boleh ditulis untuk kelas, menyediakan pendekatan metaprogramming yang lain (seperti yang dilakukan dalam pakej attrs)

Dalam bentuk yang paling mudah, definisi penghias kelihatan seperti kod berikut:

def my_first_decorator(func):
 def wrapped(*args, **kwargs):
 # do something before
 result = func(*args, **kwargs)
 # do something after
 return result
 return wrapped
@my_first_decorator
def func(a):
 return a
Salin selepas log masuk

Kod di atas, kerana apabila fungsi bersarang yang dibalut ditakrifkan, pembolehubah sekelilingnya boleh diakses dalam fungsi dan disimpan dalam memori, selagi fungsi itu digunakan di suatu tempat (Ini dipanggil penutupan dalam bahasa pengaturcaraan berfungsi).

Sangat mudah, tetapi ini mempunyai beberapa kelemahan. Masalah terbesar ialah fungsi yang diubah suai akan kehilangan nama fungsi sebelumnya (anda boleh melihat ini dengan inspect.signature), docstringnya, dan juga namanya Ini adalah masalah dengan alat dokumentasi kod sumber (seperti sphinx), Tetapi ia boleh diselesaikan dengan mudah menggunakan penghias functools.wraps dalam pustaka standard:

from functools import wraps
from typing import Any, Callable, TypeVar, ParamSpec
P = ParamSpec("P") # 需要python >= 3.10
R = TypeVar("R")
def my_second_decorator(func: Callable[P, R]) -> Callable[P, R]:
 @wraps(func)
 def wrapped(*args: Any, **kwargs: Any) -> R:
 # do something before
 result = func(*args, **kwargs)
 # do something after
 return result
 return wrapped
@my_second_decorator
def func2(a: int) -> int:
 """Does nothing"""
 return a
print(func2.__name__)
# 'func2'
print(func2.__doc__)
# 'Does nothing'
Salin selepas log masuk

Dalam contoh ini, saya telah menambah anotasi jenis dan petunjuk jenis diperlukan untuk Python tambahan penting untuk dibuat. Kebolehbacaan yang lebih baik, penyiapan kod dalam IDE, dan kebolehselenggaraan asas kod yang lebih besar hanyalah beberapa contoh. Kod di atas sepatutnya merangkumi kebanyakan kes penggunaan, tetapi penghias tidak boleh diparameterkan. Pertimbangkan untuk menulis penghias yang merekodkan masa pelaksanaan fungsi, tetapi hanya jika ia melebihi beberapa saat tertentu. Nombor ini harus dikonfigurasikan secara individu untuk setiap fungsi yang dihias. Jika tidak dinyatakan, nilai lalai harus digunakan dan penghias hendaklah digunakan tanpa kurungan untuk memudahkan penggunaan:

@time(threshold=2)
def func1(a):
...
# No paranthesis when using default threshold
@time
def func2(b):
...
Salin selepas log masuk

jika anda boleh menggunakannya dalam kurungan kes kedua , atau tidak memberikan nilai lalai untuk parameter sama sekali, maka resipi ini akan mencukupi:

from functools import wraps
from typing import Any, Callable, TypeVar, ParamSpec
P = ParamSpec("P") # 需要python >= 3.10
R = TypeVar("R")
def my_third_decorator(threshold: int = 1) -> Callable[[Callable[P, R]], Callable[P, R]]:
 def decorator(func: Callable[P, R]) -> Callable[P, R]:
 @wraps(func)
 def wrapper(*args: Any, **kwargs: Any) -> R:
 # do something before you can use `threshold`
 result = func(*args, **kwargs)
 # do something after
 return result
 return wrapper
 return decorator
@my_third_decorator(threshold=2)
def func3a(a: int) -> None:
...
# works
@my_third_decorator()
def func3b(a: int) -> None:
...
# Does not work!
@my_third_decorator
def func3c(a: int) -> None:
...
Salin selepas log masuk

Untuk menampung kes ketiga, terdapat pakej, iaitu pembalut dan penghias, yang sebenarnya boleh melakukan lebih daripada cuma Hanya tambah parameter pilihan. Walaupun kualitinya sangat tinggi, mereka memperkenalkan sedikit kerumitan tambahan. Menggunakan fungsi yang dihias bungkus, saya terus menghadapi masalah bersiri apabila menjalankan fungsi pada kelompok jauh. Setahu saya, kedua-duanya tidak ditaip sepenuhnya, jadi penyemak/linters jenis statik (seperti mypy) gagal dalam mod ketat.

Saya terpaksa menyelesaikan masalah ini apabila saya bekerja pada pakej saya sendiri dan memutuskan untuk menulis penyelesaian saya sendiri. Ia menjadi corak yang mudah digunakan semula tetapi sukar untuk ditukar menjadi perpustakaan.

Ia menggunakan penghias yang terlebih muatan daripada perpustakaan standard. Dengan cara ini, penghias yang sama boleh ditentukan untuk digunakan dengan penghias tanpa parameter kami. Selain daripada itu, ia adalah gabungan dua coretan di atas. Satu kelemahan pendekatan ini ialah semua parameter perlu diberikan sebagai hujah kata kunci (ini meningkatkan kebolehbacaan selepas semua)

from typing import Callable, TypeVar, ParamSpec
from functools import partial, wraps
P = ParamSpec("P") # requires python >= 3.10
R = TypeVar("R
@overload
def typed_decorator(func: Callable[P, R]) -> Callable[P, R]:
...
@overload
def typed_decorator(*, first: str = "x", second: bool = True) -> Callable[[Callable[P, R]], Callable[P, R]]:
...
def typed_decorator(
 func: Optional[Callable[P, R]] = None, *, first: str = "x", second: bool = True
) -> Union[Callable[[Callable[P, R]], Callable[P, R]], Callable[P, R]]:
 """
Describe what the decorator is supposed to do!
Parameters
----------
first : str, optional
First argument, by default "x".
This is a keyword-only argument!
second : bool, optional
Second argument, by default True.
This is a keyword-only argument!
"""
 def wrapper(func: Callable[P, R], *args: Any, **kw: Any) -> R:
 """The actual logic"""
 # Do something with first and second and produce a `result` of type `R`
 return result
 # Without arguments `func` is passed directly to the decorator
 if func is not None:
 if not callable(func):
 raise TypeError("Not a callable. Did you use a non-keyword argument?")
 return wraps(func)(partial(wrapper, func))
 # With arguments, we need to return a function that accepts the function
 def decorator(func: Callable[P, R]) -> Callable[P, R]:
 return wraps(func)(partial(wrapper, func))
 return decorator
Salin selepas log masuk

Kemudian, kami boleh menggunakan Penghias kami tanpa parameter

@typed_decorator
def spam(a: int) -> int:
 return a
@typed_decorator(first = "y
def eggs(a: int) -> int:
 return a
Salin selepas log masuk

Corak ini pasti mempunyai sedikit overhed, tetapi faedahnya melebihi kos.

Teks asal: ​​https://www.php.cn/link/d0f82e1046ccbd597c7f2a7bfba9e7dd​

Atas ialah kandungan terperinci Penghias Python ditaip sepenuhnya dengan parameter. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China 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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Boleh kod vs dijalankan di Windows 8 Boleh kod vs dijalankan di Windows 8 Apr 15, 2025 pm 07:24 PM

Kod VS boleh dijalankan pada Windows 8, tetapi pengalaman mungkin tidak hebat. Mula -mula pastikan sistem telah dikemas kini ke patch terkini, kemudian muat turun pakej pemasangan kod VS yang sepadan dengan seni bina sistem dan pasangnya seperti yang diminta. Selepas pemasangan, sedar bahawa beberapa sambungan mungkin tidak sesuai dengan Windows 8 dan perlu mencari sambungan alternatif atau menggunakan sistem Windows yang lebih baru dalam mesin maya. Pasang sambungan yang diperlukan untuk memeriksa sama ada ia berfungsi dengan betul. Walaupun kod VS boleh dilaksanakan pada Windows 8, disyorkan untuk menaik taraf ke sistem Windows yang lebih baru untuk pengalaman dan keselamatan pembangunan yang lebih baik.

Adakah sambungan vscode berniat jahat? Adakah sambungan vscode berniat jahat? Apr 15, 2025 pm 07:57 PM

Sambungan kod VS menimbulkan risiko yang berniat jahat, seperti menyembunyikan kod jahat, mengeksploitasi kelemahan, dan melancap sebagai sambungan yang sah. Kaedah untuk mengenal pasti sambungan yang berniat jahat termasuk: memeriksa penerbit, membaca komen, memeriksa kod, dan memasang dengan berhati -hati. Langkah -langkah keselamatan juga termasuk: kesedaran keselamatan, tabiat yang baik, kemas kini tetap dan perisian antivirus.

Cara menjalankan program di terminal vscode Cara menjalankan program di terminal vscode Apr 15, 2025 pm 06:42 PM

Dalam kod VS, anda boleh menjalankan program di terminal melalui langkah -langkah berikut: Sediakan kod dan buka terminal bersepadu untuk memastikan bahawa direktori kod selaras dengan direktori kerja terminal. Pilih arahan Run mengikut bahasa pengaturcaraan (seperti python python your_file_name.py) untuk memeriksa sama ada ia berjalan dengan jayanya dan menyelesaikan kesilapan. Gunakan debugger untuk meningkatkan kecekapan debug.

Memilih antara php dan python: panduan Memilih antara php dan python: panduan Apr 18, 2025 am 12:24 AM

PHP sesuai untuk pembangunan web dan prototaip pesat, dan Python sesuai untuk sains data dan pembelajaran mesin. 1.Php digunakan untuk pembangunan web dinamik, dengan sintaks mudah dan sesuai untuk pembangunan pesat. 2. Python mempunyai sintaks ringkas, sesuai untuk pelbagai bidang, dan mempunyai ekosistem perpustakaan yang kuat.

PHP dan Python: Paradigma yang berbeza dijelaskan PHP dan Python: Paradigma yang berbeza dijelaskan Apr 18, 2025 am 12:26 AM

PHP terutamanya pengaturcaraan prosedur, tetapi juga menyokong pengaturcaraan berorientasikan objek (OOP); Python menyokong pelbagai paradigma, termasuk pengaturcaraan OOP, fungsional dan prosedur. PHP sesuai untuk pembangunan web, dan Python sesuai untuk pelbagai aplikasi seperti analisis data dan pembelajaran mesin.

Bolehkah kod studio visual digunakan dalam python Bolehkah kod studio visual digunakan dalam python Apr 15, 2025 pm 08:18 PM

Kod VS boleh digunakan untuk menulis Python dan menyediakan banyak ciri yang menjadikannya alat yang ideal untuk membangunkan aplikasi python. Ia membolehkan pengguna untuk: memasang sambungan python untuk mendapatkan fungsi seperti penyempurnaan kod, penonjolan sintaks, dan debugging. Gunakan debugger untuk mengesan kod langkah demi langkah, cari dan selesaikan kesilapan. Mengintegrasikan Git untuk Kawalan Versi. Gunakan alat pemformatan kod untuk mengekalkan konsistensi kod. Gunakan alat linting untuk melihat masalah yang berpotensi lebih awal.

Boleh vscode digunakan untuk mac Boleh vscode digunakan untuk mac Apr 15, 2025 pm 07:36 PM

VS Kod boleh didapati di Mac. Ia mempunyai sambungan yang kuat, integrasi git, terminal dan debugger, dan juga menawarkan banyak pilihan persediaan. Walau bagaimanapun, untuk projek yang sangat besar atau pembangunan yang sangat profesional, kod VS mungkin mempunyai prestasi atau batasan fungsi.

Boleh vscode menjalankan ipynb Boleh vscode menjalankan ipynb Apr 15, 2025 pm 07:30 PM

Kunci untuk menjalankan buku nota Jupyter dalam kod VS adalah untuk memastikan bahawa persekitaran Python dikonfigurasi dengan betul, memahami bahawa perintah pelaksanaan kod adalah konsisten dengan susunan sel, dan mengetahui fail besar atau perpustakaan luaran yang boleh menjejaskan prestasi. Fungsi penyempurnaan dan debug yang disediakan oleh kod VS dapat meningkatkan kecekapan pengekodan dan mengurangkan kesilapan.

See all articles