Buscar..


Introducción

Como probablemente sepa si vino de la escuela de OOP, especializarse en una clase abstracta y usarla es una práctica que debe tener en cuenta al escribir su código.

¿Qué pasaría si pudieras definir una función abstracta y especializarla para crear diferentes versiones de ella? Piensa que es una especie de función de herencia donde se vinculan parámetros específicos para que sean confiables para un escenario específico.

Sintaxis

  • parcial (función, ** params_you_want_fix)

Parámetros

Param detalles
X el número a elevar
y el exponente
aumento La función a especializarse.

Observaciones

Como se indica en el documento de Python, functools.partial :

Devuelva un nuevo objeto parcial que, cuando se le llame, se comportará como una función llamada con los argumentos posicionales, argumentos y palabras clave de palabras clave. Si se proporcionan más argumentos a la llamada, se anexan a args. Si se proporcionan argumentos de palabras clave adicionales, amplían y anulan las palabras clave.

Consulte este enlace para ver cómo se puede implementar parcial .

Elevar el poder

Supongamos que queremos elevar x a un número y .

Escribirías esto como:

def raise_power(x, y):
    return x**y

¿Qué pasa si su valor y puede asumir un conjunto finito de valores?

Supongamos que y puede ser uno de [3,4,5] y digamos que no quiere ofrecer al usuario final la posibilidad de usar dicha función, ya que es muy computacional. De hecho, verificará si se proporciona y asume un valor válido y reescribirá su función como:

def raise(x, y):
    if y in (3,4,5):
        return x**y
    raise NumberNotInRangeException("You should provide a valid exponent")

¿Sucio? Usemos el formulario abstracto y lo especialicemos en los tres casos: implementémoslo parcialmente .

from functors import partial
raise_to_three = partial(raise, y=3)
raise_to_four = partial(raise, y=4)
raise_to_five = partial(raise, y=5)

¿Qué pasa aquí? Hemos fijado los parametros y y definimos tres funciones diferentes.

No es necesario usar la función abstracta definida anteriormente (puede hacerla privada ), pero puede usar funciones aplicadas parciales para tratar de elevar un número a un valor fijo.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow