es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo degradar un argumento de entrada de una función y mantener la compatibilidad hacia atrás.

Me gustaría cambiar los argumentos de entrada de una función. Esto también implicará cambios dentro del cuerpo de la función.
¿Cuál es una forma pythonica de marcar un argumento de entrada como “obsoleto” y mantener la compatibilidad hacia atrás al mismo tiempo? Aquí tienes un ejemplo de juguete:

from typing import List


# función original
def sum_numbers(numbers: List[int]):
    return sum(numbers)


# función con argumentos de entrada y cuerpo de función cambiados
def sum_numbers(a: int, b: int) -> int:
    return a + b

El usuario debería poder llamar a sum_numbers ya sea con el argumento numbers: List[int] o utilizando a: int, b: int. Sin embargo, quiero enviar una DeprecationWarning cuando el usuario utiliza el método de llamada original.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una forma de marcar un argumento de entrada como obsoleto en Python es utilizando el decorador @deprecated de la biblioteca deprecated. Primero, instala la biblioteca utilizando pip:

    pip install deprecated
    

    Luego, importa el decorador y úsalo en la función original:

    from typing import List
    from deprecated import deprecated
    
    @deprecated(reason="Usa los nuevos argumentos 'a' y 'b' en su lugar")
    def sum_numbers(numbers: List[int]) -> int:
        return sum(numbers)
    

    Con este decorador, cuando el usuario llame a la función con el argumento obsoleto, se generará una advertencia de DeprecationWarning con la razón especificada.

    Para mantener la compatibilidad hacia atrás y permitir que el usuario utilice los nuevos argumentos, puedes definir una nueva función que traduzca los nuevos argumentos en los antiguos y llame a la función obsoleta:

    def sum_numbers_v2(a: int, b: int) -> int:
        # traducir argumentos
        numbers = [a, b]
        # llamar a la función obsoleta
        return sum_numbers(numbers)
    

    Ahora el usuario puede llamar a cualquiera de las dos funciones con cualquiera de los conjuntos de argumentos, y el decorador @deprecated generará una advertencia si se utilizan los argumentos obsoletos.

Comments are closed.