Creació i encadenament de decoradors de funcions en Python

Creació i encadenament de decoradors de funcions en Python
Creació i encadenament de decoradors de funcions en Python

Millora de les funcions de Python amb decoradors

A Python, els decoradors són una eina poderosa per modificar el comportament de funcions o mètodes. Permeten als desenvolupadors incloure funcionalitats addicionals al voltant d'una funció existent d'una manera neta i llegible. En entendre com crear i encadenar decoradors, podeu millorar considerablement la modularitat i la llegibilitat del vostre codi.

Aquest article us guiarà a través del procés de creació de dos decoradors específics: un per fer el text en negreta i un altre per fer el text en cursiva. També demostrarem com encadenar aquests decoradors per aconseguir el resultat desitjat. Al final d'aquest tutorial, podreu cridar una funció senzilla i rebre una cadena formatada amb etiquetes HTML en negreta i cursiva.

Comandament Descripció
def Defineix una funció en Python.
f"<b>{func()}</b>" Utilitza el format de cadena f per embolicar el valor de retorn de la funció en etiquetes HTML en negreta.
return wrapper Retorna la funció d'embolcall interior, creant efectivament el decorador.
@make_bold Aplica el decorador make_bold a una funció.
@add_html_tag("i") Aplica el decorador add_html_tag amb l'etiqueta "i" a una funció.
print(say()) Imprimeix el resultat de la funció say, mostrant la sortida decorada.
def add_html_tag(tag) Defineix una funció d'ordre superior per crear un decorador d'etiquetes HTML personalitzable.
@add_html_tag("b") Aplica el decorador add_html_tag amb l'etiqueta "b" a una funció.

Entendre els decoradors de funcions de Python

Els scripts proporcionats mostren com crear i encadenar decoradors de funcions a Python per modificar el comportament de les funcions. Un decorador en Python es defineix mitjançant el def paraula clau per crear una funció que pren una altra funció com a argument i retorna una funció nova. El make_bold decorator embolcalla el resultat de la funció que decora amb etiquetes HTML en negreta utilitzant el format de cadena f: f"<b>{func()}</b>". De la mateixa manera, el make_italic El decorador embolica el resultat amb etiquetes en cursiva: f"<i>{func()}</i>". Quan aquests decoradors s'apliquen a una funció utilitzant el @decorator_name sintaxi, modifiquen la sortida de la funció afegint les respectives etiquetes HTML.

El segon script introdueix un enfocament més versàtil mitjançant la creació d'una funció d'ordre superior, add_html_tag, que genera decoradors per a qualsevol etiqueta HTML especificada. Aquesta funció pren una etiqueta HTML com a argument i retorna un decorador que embolcalla la sortida de la funció a l'etiqueta especificada: f"<{tag}>{func()}</{tag}>". Mitjançant l'ús de @add_html_tag("b") i @add_html_tag("i"), podem encadenar aquests decoradors per embolicar la sortida del say_hello funcionen tant en etiquetes en negreta com en cursiva, donant com a resultat el " desitjat "Hola". Aquests exemples il·lustren el poder i la flexibilitat dels decoradors de Python per millorar i personalitzar el comportament de les funcions d'una manera neta i reutilitzable.

Implementar i encadenar decoradors en Python

Script Python per crear i encadenar decoradors

def make_bold(func):
    def wrapper():
        return f"<b>{func()}</b>"
    return wrapper

def make_italic(func):
    def wrapper():
        return f"<i>{func()}</i>"
    return wrapper

@make_bold
@make_italic
def say():
    return "Hello"

print(say())

Creació d'etiquetes HTML amb decoradors Python

Script Python per a la modificació de funcions i etiquetatge HTML

def add_html_tag(tag):
    def decorator(func):
        def wrapper():
            return f"<{tag}>{func()}</{tag}>"
        return wrapper
    return decorator

@add_html_tag("b")
@add_html_tag("i")
def say_hello():
    return "Hello"

print(say_hello())

Tècniques avançades de decoració de Python

Més enllà de la simple modificació de funcions, els decoradors de Python ofereixen una manera potent de millorar la reutilització i el manteniment del codi. Un cas d'ús avançat són els decoradors parametritzats, que permeten als decoradors acceptar arguments. Aquesta tècnica es va il·lustrar amb el add_html_tag decorador en els exemples anteriors. En definir un decorador que genera altres decoradors, podem crear estructures de codi altament flexibles i reutilitzables. Els decoradors parametritzats ens permeten passar paràmetres al decorador mateix, permetent modificacions dinàmiques i específiques del context en el comportament de la funció.

Un altre aspecte important dels decoradors és la seva capacitat per mantenir les metadades de la funció. Quan un decorador embolcalla una funció, les seves metadades, com ara el seu nom i la cadena de documents, es poden perdre. Per preservar aquestes metadades, les de Python functools.wraps s'utilitza dins del decorador. Mitjançant la sol·licitud @functools.wraps a la funció d'embolcall, les metadades de la funció original es copien, assegurant-se que les eines que es basen en aquestes metadades, com ara els generadors de documentació, continuen funcionant correctament. A més, els decoradors es poden apilar, tal com es mostra amb el @make_bold i @make_italic exemples, per aplicar múltiples capes de modificació del comportament d'una manera neta i llegible.

Preguntes habituals sobre els decoradors de Python

  1. Què és un decorador a Python?
  2. Un decorador és una funció que modifica el comportament d'una altra funció, que normalment s'utilitza per afegir funcionalitats de manera reutilitzable.
  3. Com apliqueu un decorador a una funció?
  4. Apliqueu un decorador amb el @decorator_name sintaxi directament a sobre de la definició de la funció.
  5. Es poden aplicar diversos decoradors a una única funció?
  6. Sí, es poden apilar diversos decoradors per sobre d'una funció, cadascun aplicat en l'ordre en què apareixen.
  7. Què és un decorador parametritzat?
  8. Un decorador parametritzat és un decorador que pren arguments, permetent modificacions més dinàmiques i flexibles.
  9. Com manteniu les metadades d'una funció quan feu servir decoradors?
  10. Tu utilitzes @functools.wraps dins del decorador per copiar les metadades de la funció original a la funció d'embolcall.
  11. Per què són útils els decoradors?
  12. Els decoradors són útils per a la reutilització del codi, la llegibilitat i la separació de les preocupacions mitjançant l'encapsulació de la funcionalitat.
  13. Quina és la finalitat del return wrapper declaració en un decorador?
  14. El return wrapper La declaració retorna la funció interna, aplicant efectivament les modificacions del decorador.
  15. Es poden utilitzar els decoradors en els mètodes de classe?
  16. Sí, els decoradors es poden utilitzar tant en mètodes de classe com d'instància per modificar-ne el comportament.
  17. Com encadenes decoradors a Python?
  18. Per encadenar decoradors, apileu múltiples @decorator_name declaracions per sobre de la definició de funció.
  19. Quin és l'ús de les cordes en fa als decoradors?
  20. Les cadenes F s'utilitzen per donar format a cadenes als decoradors, permetent la inserció dinàmica de sortides de funcions en formats específics, com ara etiquetes HTML.

Resum de decoradors de funcions en Python

Els decoradors de funcions a Python ofereixen un mètode robust per modificar i millorar el comportament de les funcions. En entendre com crear, aplicar i encadenar decoradors, podeu millorar significativament la modularitat i la llegibilitat del vostre codi. Aquesta guia cobria conceptes essencials com ara decoradors simples i parametritzats, preservant les metadades de funcions amb functools.wraps, i aplicacions pràctiques dels decoradors per afegir etiquetes HTML a les sortides de funcions. El domini d'aquestes tècniques permet un codi més dinàmic i mantenible, facilitant pràctiques de programació més netes i eficients.